Android AsyncTask下载多个图像

时间:2014-02-15 16:12:09

标签: java android android-asynctask imageview

在我的Android应用程序中,我有一个AsyncTask从Web下载图片并在UI中显示它(在onPostExecute()中我正在生成一个新的ImageView)。 如何制作同时下载多个图像的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;
        }

    }

4 个答案:

答案 0 :(得分:2)

由于您不能同时发出两个请求,您可以选择执行以下操作:

  • 首先,在您的活动中,创建您的AsyncTask实例并使用类似“firstImage”的参数执行它,然后在doInBackground()中执行它,只需检查是否是传递的参数的值,如果是,请先下载图片。下载映像后,将其保存在本地变量或任何您想要的地方。然后返回一个像“firstImage”的字符串。在onPostExecute中,只需检查结果的值并将图像传回给将更新UI的活动。
  • 其次,一旦您使用第一个Image更新了UI,请使用类似“secondImage”的字符串进行第二次异步调用,并重复与之前相同的过程并更新UI - 这会将第二个图像添加到UI。你不需要这个库!

答案 1 :(得分:1)

我建议您使用Universal Image Loader库下载android中的图像。

它下载图像以及做一些更好的事情,比如缓存图像和管理内存非常棘手。

更新

如果您不想缓存图像,则可以使用Universal Image Loader库中的Configuration禁用此功能。

图书馆链接:https://github.com/nostra13/Android-Universal-Image-Loader

答案 2 :(得分:1)

只需使用onProgressUpdate(Progress...)即可。将第二个通用类型更改为位图,并在加载完图像后调用publishProgress()

答案 3 :(得分:1)

我会推荐Picasso,如果您不希望图像缓存,可以使用skipMemoryCache()