Android 何时在ListView中加载图像?

Android 何时在ListView中加载图像?,android,listview,Android,Listview,当我使用ListView时,会多次调用getView()方法。每次调用getView()时,我都会用Asyc任务加载图像。我的意思是,每次我重置图像,这是恼人的 如何理解何时加载图像?您应该缓存加载的图像,即存储在SD卡上,因此一旦您在SD卡上获得了副本,就无需再次下载。有很多现成的类可以为您完成这项工作,例如: 您必须有两个标志 如果你已经加载了图像,如果是真的,你什么也不做 如果你正在加载图像,如果是真的,你什么也不做 成员还将帮助您维护图像的状态 您的代码应该如下所示: private b

当我使用
ListView
时,会多次调用
getView()方法。每次调用
getView()
时,我都会用Asyc任务加载图像。我的意思是,每次我重置图像,这是恼人的


如何理解何时加载图像?

您应该缓存加载的图像,即存储在SD卡上,因此一旦您在SD卡上获得了副本,就无需再次下载。有很多现成的类可以为您完成这项工作,例如:


您必须有两个标志

如果你已经加载了图像,如果是真的,你什么也不做

如果你正在加载图像,如果是真的,你什么也不做

成员还将帮助您维护图像的状态

您的代码应该如下所示:

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创建图像缓存。通过这种方式,您可以将图像保留在内存中,并且仅当图像不在内存中时才需要从服务器加载。在这种方法中,当系统遇到内存不足的情况时,图像将从内存中删除。因此,您当前的活动将始终保留对位图所需的硬引用,而图像缓存将保留对位图的弱引用

下面的参考链接将帮助您

由谷歌制作的(NetworkImageView)有一个非常直观的imageView类,可以有一个url,称为“NetworkImageView”

您应该查看它并观看视频,因为它们显示使用asyncTask执行任务非常烦人(加上asyncTask已知有任务限制,大约255个)

要设置url,只需使用setImageUrl

对于加载阶段,它也有一些有用的方法:setDefaultImageResId、setErrorImageResId

它还应该有某种内置的缓存机制,但我没有读太多关于它的内容,所以您可能想查看他们的示例

这将消除对listView项使用asyncTasks的需要


我关于截击的一个问题包括一个示例代码。

您可以添加一个缓存层,并可以选择预加载图像。缓存图像(
Bitmap
确切地说是对象)的一个好策略是使用一种称为LRU或最新使用的策略

Android支持库有一个名为的类来实现这个策略。例如,当您第一次下载/加载图像时,您会将其粘贴到缓存中。稍后,您可以首先检查它是否已经在缓存中,然后从那里加载它


对于预加载,一个好的经验法则是预加载前十项和后十项。

您需要延迟加载图像。您正在从网络加载图像吗?如果是这样,那么您是否尝试过加载/缓存等操作?在Dalvik上使用弱引用进行缓存不是一个好主意。GC非常积极地收集它们,您的缓存将不会非常有效。