3

当我使用ListViewgetView() method被多次调用。每次getView()调用时,我都会使用 Asyc 任务加载图像。我的意思是每次我重置令人讨厌的图像时。

如何理解何时加载图像?

4

5 回答 5

0

Volley 库(由 google 制作)有一个非常直观的 imageView 类,它可以有一个 url ,称为 "NetworkImageView" 。

您应该检查一下并观看视频,因为它们表明使用 asyncTask 执行此操作非常烦人(而且已知 asyncTask 有任务限制,大约 255 个左右)。

要设置 url,只需使用 setImageUrl 。

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

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

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

我的一个关于凌空的问题包括一个示例代码,这里

于 2013-07-10T13:14:54.150 回答
0

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

http://greendroid.cyrilmottier.com/reference/greendroid/widget/AsyncImageView.html

于 2013-07-10T11:23:18.863 回答
0

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

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

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

于 2013-07-10T13:22:28.437 回答
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
       }
}
于 2013-07-10T11:36:50.587 回答
0

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

以下参考链接将为您提供帮助

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

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

于 2013-07-10T11:38:39.517 回答