9

我正在使用Universal Image Loader 1.8.6库来加载从网络上获取的动态图像。

配置ImageLoaderConfiguration如下:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
    .threadPoolSize(3) // default
    .threadPriority(Thread.NORM_PRIORITY - 1) // default
    .denyCacheImageMultipleSizesInMemory()
    .memoryCacheSize(2 * 1024 * 1024)
    .memoryCacheSizePercentage(13) // default
    .discCacheSize(50 * 1024 * 1024)
    .discCacheFileCount(100)
    .imageDownloader(new BaseImageDownloader(getApplicationContext())) // default
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
    .writeDebugLogs()
    .build();

DisplayImageOptions配置是:

DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.no_foto)
    .showImageForEmptyUri(R.drawable.no_foto)
    .showImageOnFail(R.drawable.no_foto)
    .build();

我的 ArrayAdapter 中的 getView 方法包含以下代码:

iv.setImageResource(R.drawable.no_foto); 
imageLoader.displayImage(basePath+immagine, iv);

上面代码的第一行只是为了避免gridView中视图的回收允许将图片设置在错误的位置(直到图片没有被下载)。

实际问题是这样的:

如果我打开我的活动(包含GridView),由于 UIL 库,显示的项目可以下载图像。(同时no_foto.png图像显示在网格的每个视图中)。当所有视图都加载了自己的图像时,如果我尝试向下滚动然后返回(向上滚动),我必须等待图像重新加载,因为所有视图现在都被no_foto.png图像占用。

如何避免重新加载这些图像?使用通用图像加载器,我可以缓存以前加载的图像吗?

注意:由于我的网格可以包含许多图像,我会使用disk cache(不是内存缓存)的实现。我发现.discCacheFileCount()可以用于设置缓存文件的最大数量,为什么我的文件似乎没有缓存?

4

2 回答 2

10

我已经解决了这个问题

我只是在声明选项,但我不想使用它,所以我修改了这一行:

imageLoader.displayImage(basePath+immagine, iv);

进入:

imageLoader.displayImage(basePath+immagine, iv, options);

我在选项中添加了方法:

.cacheOnDisc(true)
于 2013-09-12T13:06:44.873 回答
7

UIL 中默认不启用缓存,所以如果你想使用缓存,你应该使用

// Create default options which will be used for every 
//  displayImage(...) call if no options will be passed to this method
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
    ...
    .cacheInMemory()
    .cacheOnDisc()
    ...
    .build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
    ...
    .defaultDisplayImageOptions(defaultOptions)
    ...
    .build();
ImageLoader.getInstance().init(config); // Do it on Application start

在加载图像时使用:

// Then later, when you want to display image
ImageLoader.getInstance().displayImage(imageUrl, imageView); // Default options will be used

另一种方法是

DisplayImageOptions options = new DisplayImageOptions.Builder()
    ...
    .cacheInMemory()
    .cacheOnDisc()
    ...
    .build();
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); 

你可以在这里找到更多信息

于 2013-09-12T13:06:51.637 回答