2015-07-31 5 views
0

Я новичок в разработке Android и Java.IOException Parsing Android

я получил следующее сообщение об ошибке:

Could not load Bitmap from: /images/image.php....... 

ошибка возникает в этом блоке коды:

public class JSONImageViewer extends Activity { 

    private GridView gridV; 
    private ImageAdapter imageAdapter; 

    public int currentPage = 1; 
    public int TotalPage = 0; 

    public Button btnNext; 
    public Button btnPre; 

    private final static String TAG_IMG = "CarImageLink"; 

    ArrayList<HashMap<String, Object>> MyArrList = new ArrayList<HashMap<String, Object>>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // ProgressBar 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 

     setContentView(R.layout.activitymain); 

     // GridView and imageAdapter 
     gridV = (GridView) findViewById(R.id.gridView1); 
     gridV.setClipToPadding(false); 
     imageAdapter = new ImageAdapter(getApplicationContext()); 
     gridV.setAdapter(imageAdapter); 


     // Next 
     btnNext = (Button) findViewById(R.id.btnNext); 
     btnNext.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       currentPage = currentPage + 1; 
       ShowData(); 
      } 
     }); 

     // Previous 
     btnPre = (Button) findViewById(R.id.btnPre); 
     btnPre.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       currentPage = currentPage - 1; 
       ShowData(); 
      } 
     }); 

     // Show first load 
     ShowData(); 

    } 

    public void ShowData() 
    { 
     btnNext.setEnabled(false); 
     btnPre.setEnabled(false); 

     setProgressBarIndeterminateVisibility(true); 
     new LoadContentFromServer().execute(); 
    } 


    class LoadContentFromServer extends AsyncTask<Object, Integer, Object> { 

     @Override 
     protected Object doInBackground(Object... params) { 

      String url = "http://....."; 

      //JSONArray data; 
      JSONObject data; 
      try { 

       //data = new JSONArray(getJSONUrl(url)); 
       data = new JSONObject(getJSONUrl(url)); 
       JSONArray dataArray = data.getJSONArray("car_images"); 
       MyArrList = new ArrayList<HashMap<String, Object>>(); 
       HashMap<String, Object> map; 

        /* 
        * TotalRows = Show for total rows 
        * TotalPage = Show for total page 
        */ 

       int displayPerPage = 9; // Per Page 
       int TotalRows = data.length(); 
       int indexRowStart = ((displayPerPage * currentPage) - displayPerPage); 

       if (TotalRows <= displayPerPage) { 
        TotalPage = 1; 
       } else if ((TotalRows % displayPerPage) == 0) { 
        TotalPage = (TotalRows/displayPerPage); 
       } else { 
        TotalPage = (TotalRows/displayPerPage) + 1; 
        TotalPage = (int) TotalPage; 
       } 
       int indexRowEnd = displayPerPage * currentPage; 
       if (indexRowEnd > TotalRows) { 
        indexRowEnd = TotalRows; 
       } 

       for (int i = 0; i < dataArray.length(); i++) { 
        map = new HashMap<String, Object>(); 
        JSONObject c = dataArray.getJSONObject(i); 

        // Thumbnail Get ImageBitmap To Object 
        Bitmap newBitmap = loadBitmap(c.getString(TAG_IMG)); 
        map.put("CarImageLink", newBitmap); 

        MyArrList.add(map); 
        Log.v("MyArrList", MyArrList.toString()); 
        publishProgress(i); 
       } 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 


     @Override 
     public void onProgressUpdate(Integer... progress) { 
      imageAdapter.notifyDataSetChanged(); 
     } 

     @Override 
     protected void onPostExecute(Object result) { 

      // Disabled Button Next 
      if(currentPage >= TotalPage) { 
       btnNext.setEnabled(false); 
      } 
      else { 
       btnNext.setEnabled(true); 
      } 

      // Disabled Button Previous 
      if(currentPage <= 1) { 
       btnPre.setEnabled(false); 
      } 
      else { 
       btnPre.setEnabled(true); 
      } 

      setProgressBarIndeterminateVisibility(false); // When Finish 
     } 
    } 


    class ImageAdapter extends BaseAdapter { 

     private Context mContext; 

     public ImageAdapter(Context context) { 
      mContext = context; 
     } 

     public int getCount() { 
      return MyArrList.size(); 
     } 

     public Object getItem(int position) { 
      return MyArrList.get(position); 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 

      LayoutInflater inflater = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.activity_column, null); 
      } 


      // ColPhoto 
      ImageView imageView = (ImageView) convertView.findViewById(R.id.ColPhoto); 
      imageView.getLayoutParams().height = 60; 
      imageView.getLayoutParams().width = 60; 
      imageView.setPadding(5, 5, 5, 5); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      try 
      { 
       imageView.setImageBitmap((Bitmap)MyArrList.get(position).get("CarImageLink")); 
       Log.v("MyArrList2", MyArrList.toString()); 
      } catch (Exception e) { 
       // When Error 
       imageView.setImageResource(android.R.drawable.ic_menu_report_image); 
      } 

      return convertView; 

     } 

    } 

    /*** Get JSON Code from URL ***/ 
    public String getJSONUrl(String url) { 

     StringBuilder str = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 

     try { 
      HttpResponse response = client.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 

      int statusCode = statusLine.getStatusCode(); 

      if (statusCode == 200) { 
       // Download OK 
       HttpEntity entity = response.getEntity(); 
       InputStream content = entity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
       String line; 

       while ((line = reader.readLine()) != null) { 
        str.append(line); 
       } 
      } else { 
       Log.e("Log", "Failed to download file.."); 
      } 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return str.toString(); 
    } 

    /***** Get Image Resource from URL *****/ 
    private static final String TAG = "CarImageLink"; 
    private static final int IO_BUFFER_SIZE = 4 * 1024; 

    public static Bitmap loadBitmap(String url) { 

     Bitmap bitmap = null; 
     InputStream in = null; 
     BufferedOutputStream out = null; 

     try { 
      in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE); 

      final ByteArrayOutputStream dataStream = new ByteArrayOutputStream(); 
      out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE); 
      copy(in, out); 
      out.flush(); 

      final byte[] data = dataStream.toByteArray(); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 1; 

      bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options); 
     } catch (IOException e) { 
      Log.e(TAG, "Could not load Bitmap from: " + url); 
     } finally { 
      closeStream(in); 
      closeStream(out); 
     } 

     return bitmap; 
    } 

    private static void closeStream(Closeable stream) { 
     if (stream != null) { 
      try { 
       stream.close(); 
      } catch (IOException e) { 
       android.util.Log.e(TAG, "Could not close stream", e); 
      } 
     } 
    } 

    private static void copy(InputStream in, OutputStream out) throws IOException { 
     byte[] b = new byte[IO_BUFFER_SIZE]; 
     int read; 
     while ((read = in.read(b)) != -1) { 
      out.write(b, 0, read); 
     } 
    } 

Ради целостности данных, я буду ограничивать количество JSON синтаксического анализа данных и показанный url.

Я исследовал эти ошибки и попытался применить решения, полученные без успеха.

Любые предложения приветствуются. Спасибо.

+0

это помогло бы увидеть, что массив JSON - даже если значения заполняются фиктивными данными – Cobbles

+0

что такое getJSONUrl() – lisztomania

+0

@Cobbles Это понятно. Я обновил. Спасибо. – JohnWilliams

ответ

0

То, что вы получаете как ответ, не является JSONArray, это JSONObject. Попробуйте это: new JSONObject(getJSONUrl(url));

+0

Привет. Спасибо. Я применил это изменение и получил: 'getJSONObject (java.lang.String)' в 'org.json.JSONObject' не может быть применен к '(int)' в JSONObject c = data.getJSONObject (i); of doInBackground. Я предполагаю, что это происходит, поскольку объект не является массивом. Может быть? Какие-либо предложения? – JohnWilliams

+0

Хорошо подумай об этом. Теперь у вас есть объект JSON, и вы хотите получить доступ к базовому JSONArray. 'data.getJSONArray (" car_images ")' затем попробуйте выполнить итерацию через это – d0nut

+0

Получаю ошибку IOException. Я выложу свой обновленный код выше. – JohnWilliams

0

{ "car_images": [{ "автомобиль ....} является JSONObject не JSONArray

Вы должны изменить данные в JSONObject

JSONObject data = new JSONObject(getJSONUrl(url)); 

Тогда вы получите массив :

JSONArray dataArray = data.getJSONArray("car_images"); 
+0

Привет. Это начинает иметь смысл, потому что мне нужно перебирать массив для получения данных JSON. Спасибо. Где я должен разместить JSONArray в функции: doInBackground? – JohnWilliams

+0

Да как раз перед: 'MyArrList = новый ArrayList >();' – lisztomania

+0

Отлично! Благодарю. Теперь я должен перебирать этот массив до или после этого: for (int i = indexRowStart; i JohnWilliams