当我使用ListView
时getView() method
被多次调用。每次getView()
调用时,我都会使用 Asyc 任务加载图像。我的意思是每次我重置令人讨厌的图像时。
如何理解何时加载图像?
Volley 库(由 google 制作)有一个非常直观的 imageView 类,它可以有一个 url ,称为 "NetworkImageView" 。
您应该检查一下并观看视频,因为它们表明使用 asyncTask 执行此操作非常烦人(而且已知 asyncTask 有任务限制,大约 255 个左右)。
要设置 url,只需使用 setImageUrl 。
它也有一些用于加载阶段的有用方法:setDefaultImageResId、setErrorImageResId。
它也应该内置某种缓存机制,但我没有阅读太多关于它的内容,所以您可能想查看他们的示例。
这将消除对 listView 的项目使用 asyncTasks 的需要。
我的一个关于凌空的问题包括一个示例代码,这里。
您应该通过将 ie 存储在 SD 卡上来缓存加载的图像,因此一旦您在那里获得了副本,就无需再次下载它。有很多现成的类可以为您完成这项工作,例如:
http://greendroid.cyrilmottier.com/reference/greendroid/widget/AsyncImageView.html
您可以添加缓存层并可选择预加载图像。缓存图像(Bitmap
确切地说是对象)的一个好策略是使用称为 LRU 或最近最少使用的策略。
Android 支持库有一个名为LruCache的类来实现此策略。因此,例如,当您第一次下载/加载图像时,您会将其粘贴到缓存中。稍后,您可以先检查它是否已经在缓存中并从那里加载。
对于预加载,一个好的经验法则是预加载前十个和后十个项目。
你必须有两个标志。
一个说如果你已经加载了图像,如果是真的你什么都不做。
一个表示您当前是否正在加载图像,如果为真,您什么也不做。
成员还将帮助您维护图像的状态。
您的代码应如下所示:
private boolean isLoading = false;
private boolean hasLoaded = false;
if(!hasLoaded){
if(!isLoading){
isLoading = true;
//do async load
//on positive completition callback set hasLoaded to true
//on negative completition callback set isLoading to false
}
}
最好的解决方案之一是使用 WeakReference 创建图像缓存。这样,您可以将图像保存在内存中,并且只需要在它们不在内存中时从服务器加载。在这种方法中,当系统遇到内存不足的情况时,图像将从内存中删除。因此,您当前的活动将始终保持对位图所需的硬引用,而图像缓存将保持对位图的弱引用。
以下参考链接将为您提供帮助
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
http://www.codeproject.com/Articles/35152/WeakReferences-as-a-Good-Caching-Mechanism