何时在ListView中加载图像?

3
当我使用 ListView 时,getView() 方法 会被多次调用。每次当 getView() 被调用时,我都会使用 Asyc 任务加载图片。也就是说,每次我都要重设这张图片,这很麻烦。
如何判断何时加载图片?

你需要对图像进行延迟加载。 - Knossos
你是否正在从网络加载图像?如果是的话,那么你是否尝试过 https://developers.google.com/events/io/sessions/325304728 这个为你提供了加载/缓存等功能的工具呢? - sandrstar
5个回答

0

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
       }
}

0

创建使用WeakReference的图像缓存是最好的解决方案之一。这样,您可以将图像保留在内存中,并且只需要在它们不在内存中时从服务器加载。在此方法中,当系统遇到低内存情况时,图像将从内存中删除。因此,您当前的活动始终会保留对所需位图的硬引用,而图像缓存将保留对位图的弱引用。

以下参考链接将帮助您

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

http://www.codeproject.com/Articles/35152/WeakReferences-as-a-Good-Caching-Mechanism


在Dalvik上使用弱引用进行缓存并不是一个很好的主意。垃圾回收器会相当积极地收集它们,因此您的缓存效果不会很好。 - laalto

0

Volley库(由Google制作)有一个非常直观的类,用于具有URL的imageView,称为“NetworkImageView”。

你应该看一下视频,因为他们展示了使用asyncTask这个过程相当烦人(而且asyncTask已知有任务限制,大约255个左右)。

要设置URL,只需使用setImageUrl方法。

它还有一些有用的加载阶段方法:setDefaultImageResId、setErrorImageResId。

它还应该具有某种内置缓存机制,但我没有仔细阅读过,所以你可能需要查看他们的样例。

这将消除在listView中使用asyncTasks的需要。

我关于volley的问题之一包括一个样例代码在这里


0

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

Android支持库有一个名为LruCache的类,实现了这种策略。 因此,例如,当您第一次下载/加载图像时,将其放入缓存中。 稍后,您可以首先检查它是否已经在缓存中,并从那里加载它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接