2014-02-15 4 views
1

В моем приложении для Android у меня есть AsyncTask для загрузки изображения из Интернета и отображения его в пользовательском интерфейсе (в onPostExecute() я создаю новый ImageView). Как сделать AsyncTask, который загружает более одного изображения одновременно, и показывать одиночные изображения непосредственно при их загрузке, даже если другие не готовы?Android AsyncTask Загрузите несколько изображений

Это мой код:

public class DownloadImages extends 
      AsyncTask<Void, Void, Bitmap> { 


     @Override 
     protected Bitmap doInBackground(Void... params) { 

      Bitmap bitmap = null; 
      bitmap = downloadBitmap("HERE's MY URL"); 


      return bitmap; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 


      ImageView image = new ImageView(context); 
      image.setImageBitmap(result); 


      ((ViewGroup) planLinearLayout).addView(image); 


     } 


     } 

     public Bitmap downloadBitmap(String url) { 
      final AndroidHttpClient client = AndroidHttpClient 
        .newInstance("Android"); 
      final HttpGet getRequest = new HttpGet(url); 

      try { 
       HttpResponse response = client.execute(getRequest); 
       final int statusCode = response.getStatusLine().getStatusCode(); 
       if (statusCode != HttpStatus.SC_OK) { 
        Log.w("ImageDownloader", "Error " + statusCode 
          + " while retrieving bitmap from " + url); 
        return null; 
       } 

       final HttpEntity entity = response.getEntity(); 
       if (entity != null) { 
        InputStream inputStream = null; 
        try { 
         inputStream = entity.getContent(); 
         final Bitmap bitmap = BitmapFactory 
           .decodeStream(inputStream); 


         return bitmap; 
        } finally { 
         if (inputStream != null) { 
          inputStream.close(); 
         } 
         entity.consumeContent(); 
        } 
       } 
      } catch (Exception e) { 
       // Could provide a more explicit error message for IOException 
       // or 
       // IllegalStateException 
       getRequest.abort(); 
       Log.w("ImageDownloader", "Error while retrieving bitmap from " 
         + url); 
      } finally { 
       if (client != null) { 
        client.close(); 
       } 
      } 
      return null; 
     } 

    } 
+0

Как создать новый экземпляр вашей AsyncTask для каждого изображения? – Merlevede

+0

Я просто сказал ему/ей сделать это в моем ответе ниже! – Eenvincible

ответ

1

Я рекомендую вам использовать универсальную библиотеку Image Loader, чтобы загрузить изображения в андроиде.

Загрузите изображение, а также сделайте еще несколько полезных вещей, таких как кеширование изображений и управление памятью очень сложно.

Update

Если вы не хотите кэшировать изображения, то вы можете отключить эту функцию с помощью Configuration в библиотеке Image Loader универсальной.

Библиотека Ссылки: https://github.com/nostra13/Android-Universal-Image-Loader

+0

Это моя проблема: мне не нужно кэшировать изображения, потому что я загружаю изображения с сервера, и имя файла такое же, но изображения меняются каждый день (это план замещения). Библиотека кэширует изображение по имени и всегда показывает то же самое. – jwandscheer

+0

Нет ли API в UIL для отключения кэширования? – Niko

+0

Я обновил свой ответ –

1

Просто сделать использование onProgressUpdate(Progress...). Измените свой второй общий тип на Bitmap и вызовите publishProgress() после того, как вы закончите загрузку изображения.

1

Я бы порекомендовал Picasso, там вы можете использовать skipMemoryCache(), если вы вообще не хотите, чтобы изображения были кэшированы.

2

Поскольку вы не можете сделать два запроса на один раз, вы можете альтернативно сделать следующее:

  • Во-первых, в своей деятельности, создавать экземпляр AsyncTask и выполнить ее с аргументом типа «firstImage», а затем в doInBackground(), просто проверьте, является ли это значением переданного аргумента, и если да, загрузите первое изображение. После загрузки изображения сохраните его где-нибудь в локальной переменной или независимо от того, что вы хотите. Затем верните строку, как «firstImage». Внутри onPostExecute просто проверьте значение результата и передайте изображение в действие, которое будет обновлять пользовательский интерфейс.
  • Во-вторых, как только вы обновили пользовательский интерфейс с первым изображением, сделайте второй вызов Async со строкой типа «secondImage» и повторите тот же процесс, что и раньше, и обновите интерфейс - это добавит второе изображение в пользовательский интерфейс. Для этого вам не нужна библиотека!
Смежные вопросы