如何使用Universal Image Loader在intent Service(后台线程)中缓存图像

时间:2013-12-10 20:24:32

标签: android caching universal-image-loader

我正在测试升级以使用Android Universal Image Loader 1.9.0。我在Android 4.2上测试了这个。我遇到了一个问题,我在意图服务中下载和缓存图像,以便在后台线程上运行,以免干扰用户。但是,UIL抱怨我没有在主线程上加载这些图像。我不想在主线程上加载这些图像,我只是希望能够在后台将它们缓存在光盘上,以便在用户实际查看指定图像时不需要下载它们。除了ImageLoader.loadImage之外,还有另一种方法可以在后台线程上预先缓存图像吗?如果没有,我如何允许在不是主线程的线程上预先缓存光盘?所有这些代码都在IntentService中运行。

ImageLoaderConfiguration:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            getApplicationContext())
            .threadPriority(Thread.MAX_PRIORITY)
            .memoryCacheSize(memoryCacheSize)
            .denyCacheImageMultipleSizesInMemory()
            .threadPoolSize(5)
            .discCacheFileNameGenerator(new MyFileNameGenerator())
            .tasksProcessingOrder(QueueProcessingType.LIFO)
            .build();

DisplayImageOptions:

 DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc()
                .imageScaleType(ImageScaleType.NONE).build();

加载图片代码:

imageLoader.loadImage(imageURI, options,
            new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage)
                {
                    loadNext();  // gives a notification update and loads next image URI in queue
                }

                @Override
                public void onLoadingFailed(String imageUri, View view,
                        FailReason failReason)
                {
                    loadNext(); // gives a notification update and loads next image URI in queue
                }
            });

2 个答案:

答案 0 :(得分:2)

实际上UIL没有提供预加载图像的方法,即只是添加到光盘缓存。它总是返回解码的Bitmap。

但在您的情况下,您可以使用loadImageSync(...)。我认为这对你更合适。

答案 1 :(得分:0)

在深入了解UIL的代码后,我想出了一个解决方案。不确定它是最好的,但将来可以帮助某人。如果在DisplayImageOptions中设置自己的处理程序,它会跳过检查以确保处理程序在主线程上:

DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc()
            .imageScaleType(ImageScaleType.NONE)
            .handler(new Handler()) // added this line
            .build();