当我使用ListView
时,多次调用getView() method
。每次调用getView()
时,我都会使用Asyc任务加载图像。我的意思是每次我重置图像都很烦人。
如何理解何时加载图片?
答案 0 :(得分:0)
您应该通过存储在SD卡上来缓存已加载的图像,因此一旦您获得了副本,就无需再次下载。有许多可以为您完成工作的即用型课程,例如:
http://greendroid.cyrilmottier.com/reference/greendroid/widget/AsyncImageView.html
答案 1 :(得分:0)
你必须有两面旗帜。
如果您已经加载了图像,则表示如果是,则不执行任何操作。
如果您当前正在加载图片,则表示如果是,则不执行任何操作。
成员还将帮助您维护图像的状态。
您的代码应如下所示:
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
}
}
答案 2 :(得分:0)
最好的解决方案之一是使用WeakReference创建图像缓存。这样,您可以将图像保留在内存中,只有当它们不在内存中时才需要从服务器加载。在该方法中,当系统遇到低内存情况时,将从存储器中移除图像。因此,您当前的活动将始终保持对位图所需的硬参考,并且图像缓存将保留对位图的弱引用。
以下参考链接将帮助您
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
http://www.codeproject.com/Articles/35152/WeakReferences-as-a-Good-Caching-Mechanism
答案 3 :(得分:0)
Volley library(谷歌制作)有一个非常直观的classView,可以有一个名为“NetworkImageView”的网址。
你应该检查一下并观看视频,因为他们表明使用asyncTask来做这件事非常烦人(加上asyncTask已知有大约255个左右的任务限制)。
用于设置网址,只需使用setImageUrl。
它也为加载阶段提供了一些有用的方法:setDefaultImageResId,setErrorImageResId。
它也应该有某种内置的缓存机制,但我没有读过很多,所以你可能想看看他们的样本。
这将消除对listView项目使用asyncTasks的需要。
关于排球的一个问题包括示例代码here。
答案 4 :(得分:0)
您可以添加缓存图层,也可以选择预加载图像。缓存图像(确切地说Bitmap
个对象)的一个好策略是使用一个名为LRU或最近最少使用的的策略。
Android支持库有一个名为LruCache的类,可以实现此策略。因此,例如,当您第一次下载/加载图像时,将其粘贴到缓存中。稍后,您可以先检查它是否已经在缓存中并从那里加载它。
对于预加载,一个好的经验法则是预加载前十个和后十个项目。