为什么我的图像加载到listView这么慢?

时间:2014-08-08 21:49:04

标签: java android image bitmap compression

我有一个带有ImageViews的listView。

我尝试使用以下代码压缩位图:

    public void getImage(final String urlStr, final ImageView toSet) {
        // set the tag immediately, to prevent delayed image downloads from
        // setting this image.
        toSet.setTag(urlStr);

        getImage(urlStr, new ImageRepository.ImageRepositoryListener() {
            @Override
            public void onImageRetrieved(final Drawable drawable) {
                if (drawable == null)
                    return;
                toSet.post(new Runnable() {
                    @Override
                    public void run() {
                        // make sure the tag is still the one we set at the
                        // beginning of this function
                        if (toSet.getTag() == urlStr) {
                            toSet.setImageDrawable(drawable);
                            drawable.setCallback(null);
                        }
                    }
                });
            }
        });

    }


public class DownloadImageAsyncTask2 extends
            AsyncTask<String, Void, Bitmap> {
        private final ImageView imageView;
        private String imageUrl;

        public DownloadImageAsyncTask2(ImageView imageView) {
            this.imageView = imageView;
        }

        @Override
        protected void onPreExecute() {
            Log.i("DownloadImageAsyncTask", "Starting image download task...");
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            imageUrl = params[0];
            try {

                imageRepository.getImage(imageUrl, imageView);

                return BitmapFactory.decodeStream((InputStream) new URL(
                        imageUrl).getContent());
            } catch (IOException e) {
                Log.e("DownloadImageAsyncTask", "Error reading bitmap" + e);
                downloadingImageUrls.remove(imageUrl);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {

            imageCache.put(imageUrl, bitmap);
            downloadingImageUrls.remove(imageUrl);

            if (bitmap != null
                    && ((String) imageView.getTag()).equals(imageUrl)) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }

如何让图像加载时间更快?

(我试图缩小服务器端的图像尺寸,但我想想在客户端可以改进什么)。

我使用异步下载任务下载图像和缓存层以保留它们。

以下是代码:

1 个答案:

答案 0 :(得分:0)

您的图片加载速度很慢,因为:

在缓存中下载并保存图像后,AsyncTask用于加载,但不会立即显示结果。

  • 首先,它由全局线程池控制,并且最大线程数最多。有时候,它会在完成其他AsyncTask之后开始。

  • 其次,方法“onPostExecute”在主线程中执行,但在完成主线程的所有其他消息后执行。

所以:

  • 仅使用AsyncTask下载并保存缓存中的图像。

  • 在使用AsyncTask之前,尝试检查缓存中是否存在预期的图像。如果它存在,则直接在主线程中显示它。确保预期图像的大小适合您的图像视图。

在您的情况下,添加如下代码:

public void getImage(final String urlStr, final ImageView toSet) {
    //get the expected image associated with this url and the size of this image view in the cache
    Bitmap bitmap = getExpectedBitmap(urlStr,expectedSize); 
    if(bitmap != null) {
        //if it exists , set it in the image view and finish.
        toSet.setImageBitmap(bitmap);
        return;
    }

    // set the tag immediately, to prevent delayed image downloads from
    // setting this image.
    toSet.setTag(urlStr);

    getImage(urlStr, new ImageRepository.ImageRepositoryListener() {
        @Override
        public void onImageRetrieved(final Drawable drawable) {
            if (drawable == null)
                return;
            toSet.post(new Runnable() {
                @Override
                public void run() {
                    // make sure the tag is still the one we set at the
                    // beginning of this function
                    if (toSet.getTag() == urlStr) {
                        toSet.setImageDrawable(drawable);
                        drawable.setCallback(null);
                    }
                }
            });
        }
    });

}