【问题标题】:why are my images loaded so slow to the listView?为什么我的图像加载到 listView 的速度如此之慢?
【发布时间】:2014-08-08 21:49:03
【问题描述】:

我有一个带有 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);
            }
        }
    }

如何让图片加载速度更快?

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

我使用异步下载任务来下载图像并使用缓存层来保存它们。

代码如下:

【问题讨论】:

  • 您是否考虑过使用任何可以为您处理所有这些的开源库,例如Picasso

标签: java android image bitmap compression


【解决方案1】:

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

在缓存中下载并保存图像后,使用 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);
                    }
                }
            });
        }
    });

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2012-03-02
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多