0

Я использую этот код:Как скачать изображение с адреса?

private class AsyncGetCatalogs extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      Map<String, String> catalogsBuffer = Requester.getCatalog(); 
      catalogsNumber = catalogsBuffer.size(); 
      catalogs = new catalogInfo[catalogsNumber]; 
      int n = 0; 
      for(Map.Entry<String, String> entry : catalogsBuffer.entrySet()) { 
       catalogs[n] = new catalogInfo(); 
       String name = entry.getKey(); 
       String link = entry.getValue(); 
       String imageLink = Requester.getCatalogImageLink(name); 
       byte imgBuf[] = Requester.getCatalogImage(imageLink); 
       Bitmap bitmap = BitmapFactory.decodeByteArray(imgBuf, 0, imgBuf.length); 
       catalogs[n].setBitmap(bitmap); 
       catalogs[n].setCatLink(link); 
       catalogs[n].setCatName(name); 
       n++; 

      } 

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

    @Override 
    protected void onPostExecute(Void result) { 
     try { 
      LinearLayout catsLayouts[] = new LinearLayout[catalogsNumber]; 
      for(int i=0;i<catalogsNumber;i++) { 
       catsLayouts[i] = new LinearLayout(getApplicationContext()); 
       ImageView catImageView = new ImageView(getApplicationContext()); 
       catImageView.setImageBitmap(catalogs[i].getImage()); 
       catsLayouts[i].addView(catImageView); 
       mainLayout.addView(catsLayouts[i]); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

аварий приложений на:

byte imgBuf[] = Requester.getCatalogImage(imageLink); 

С такой трассировки стека;

01-25 00:22:26.998: E/AndroidRuntime(975): FATAL EXCEPTION: AsyncTask #2 
01-25 00:22:26.998: E/AndroidRuntime(975): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.lang.Thread.run(Thread.java:856) 
01-25 00:22:26.998: E/AndroidRuntime(975): Caused by: java.lang.NoClassDefFoundError: javax.imageio.ImageIO 
01-25 00:22:26.998: E/AndroidRuntime(975): at IrkroseRequester.IrkroseRequester.getCatalogImage(IrkroseRequester.java:152) 
01-25 00:22:26.998: E/AndroidRuntime(975): at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:79) 
01-25 00:22:26.998: E/AndroidRuntime(975): at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:1) 
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

** getCatalog Изображение **

public byte[] getCatalogImage(String _link) throws IOException { 
    String link = "http://irkrose.ru/images/catalogImages/"+_link; 
    URL url = new URL(_link); 
    BufferedImage img = ImageIO.read(url); 
    ByteArrayOutputStream res = new ByteArrayOutputStream(); 
    ImageIO.write(img, "jpg", res); 
    return res.toByteArray(); 
} 

Как я понимаю, он не может найти ImageIO. Я знаю, что у андроида это не так, но вся функция, использующая ImageIO, находится в другом пакете java, просто добавленном в приложение как lib. Приложение android работает только с байтовым массивом.

Итак, что не так? И как я могу загрузить .jpg изображение с URL-адреса другим способом? И может быть проблема с классом async?

+1

Пожалуйста, следуйте моему ответу http://stackoverflow.com/questions/541966/how-do-i-do-a-lazy-load-of-images-in-listview/14827292#14827292 –

+3

'ImageIO' является класс JAVA SE, который не является avaialble для Android API .. Конечно, Android использует Java, но настроен в некоторой степени. –

+1

Android_Query - одна из лучших библиотек. и ваша проблема будет решена –

ответ

0

Попробуйте это:

private class GetImageTaskextends AsyncTask<String, Void, Bitmap> { 
    ImageView tempBitmapImage; 

    public GetImageTask(ImageView tempBitmapImage) { 
     this.tempBitmapImage = tempBitmapImage; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     tempBitmapImage.setImageBitmap(result); 
    } 
} 

И использовать его как это:

new GetImageTask((ImageView) imgIcon).execute("www.test.com/test.jpg"); 

Я надеюсь, что это помогает.