ListView
时,getView() 方法
会被多次调用。每次当 getView()
被调用时,我都会使用 Asyc 任务加载图片。也就是说,每次我都要重设这张图片,这很麻烦。如何判断何时加载图片?
你应该缓存加载的图片,比如将它们存储在SD卡上,这样一旦你在那里有了副本,就不需要再次下载。有很多现成的类可以帮你完成这项工作,例如:
http://greendroid.cyrilmottier.com/reference/greendroid/widget/AsyncImageView.html
你必须拥有两个标志。
一个用于判断是否已经加载了图像,如果为真,则不执行任何操作。
另一个用于判断当前是否正在加载图像,如果为真,则不执行任何操作。
成员变量也将帮助您维护图像的状态。
您的代码应该类似于以下内容:
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
Volley库(由Google制作)有一个非常直观的类,用于具有URL的imageView,称为“NetworkImageView”。
你应该看一下视频,因为他们展示了使用asyncTask这个过程相当烦人(而且asyncTask已知有任务限制,大约255个左右)。
要设置URL,只需使用setImageUrl方法。
它还有一些有用的加载阶段方法:setDefaultImageResId、setErrorImageResId。
它还应该具有某种内置缓存机制,但我没有仔细阅读过,所以你可能需要查看他们的样例。
这将消除在listView中使用asyncTasks的需要。
我关于volley的问题之一包括一个样例代码在这里。
您可以添加缓存层并可选择预加载图像。 缓存图像(确切地说是 Bitmap
对象)的良好策略是使用称为LRU或最近最少使用的策略。
Android支持库有一个名为LruCache的类,实现了这种策略。 因此,例如,当您第一次下载/加载图像时,将其放入缓存中。 稍后,您可以首先检查它是否已经在缓存中,并从那里加载它。
对于预加载,一个很好的经验法则是预加载前十个和后十个项目。