我有一个自定义AdapterView(某种类型),其中我懒惰加载图像。要做到这一点,我使用了令人敬畏的aquery library。
短篇小说:我想缓存(memcache和filecache)文件的缩减采样版本。它可以更快地添加到我的适配器 - 当图像很小时,滚动我的AdapterView时没有滞后。当图像很大时,即使我使用下采样它也会稍微滞后。我发现aquery
存储完整版本的图片,并在每次调用aq.image(...)
时对其进行下采样。 如何缓存已调整大小的版本,而不是原始版本?
长篇故事: 我的AdapterView严重依赖于图像。这些图像相当大,当适配器项被实例化时,需要一些时间对其进行下采样,然后添加到列表中。所以我认为在滚动时用lo-res照片实例化项目会很好,并且只在滚动停止时加载高分辨率版本。当我使用两个单独的图像网址(一个用于thumnbail,另一个用于原始图像)时,它就像一个魅力。但我使用的API非常有限,所以我不会有缩略图的网址。我必须异步下载大版本,下载它,保存大小版本,然后使用我需要的任何一个。在这里,“短篇小说”开始了。
答案 0 :(得分:2)
我刚刚发布了一个名为droidQuery的开源库,它是Android的 jQuery 的完整端口。它比AQuery
简单易用,并提供了更多配置。要下载图像并设置输出大小,并缓存小图像(基于每个会话/每十分钟),您可以使用以下代码:
final ImageView image = (ImageView) findViewById(R.id.myImage);
$.ajax(new AjaxOptions(url).type("GET")
.dataType("image")
.imageHeight(200)
.imageWidth(200)
.context(this)
.cache(true)
.cacheTimeout(600000)
.success(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
$.with(image).val((Bitmap) params[0]);
}
})
.error(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
droidQuery.toast("could not set image", Toast.LENGTH_SHORT);
}
}));
答案 1 :(得分:1)
我过去也使用过AQuery库,但在遇到有限配置和奇怪的progresbar可见性问题后,我转向Android-Universal-Image Loader
https://github.com/nostra13/Android-Universal-Image-Loader它为您提供了所需的功能以及许多其他有用的配置选项。
只需从上到下阅读本网站 - 您应该能够在一分钟内运行它。
在你的情况下,最有趣的行是
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75)
.discCache(new UnlimitedDiscCache(cacheDir)) // default
.discCacheSize(50 * 1024 * 1024)
.discCacheFileCount(100)
您还可以更改缓存的文件名。