Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的图像加载到listView的速度如此之慢?_Java_Android_Image_Bitmap_Compression - Fatal编程技术网

Java 为什么我的图像加载到listView的速度如此之慢?

Java 为什么我的图像加载到listView的速度如此之慢?,java,android,image,bitmap,compression,Java,Android,Image,Bitmap,Compression,我有一个带有ImageView的列表视图 我尝试用以下代码压缩位图: 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);

我有一个带有ImageView的列表视图

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

    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);
            }
        }
    }
如何使图像加载时间更快

我曾尝试缩小服务器端的映像,但我想想想在客户端可以改进什么

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


下面是代码:

您的图像加载很慢,因为:

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

}

您是否考虑过使用任何一个为您处理所有这些问题的开源库,比如?