在回收利用中处理视图的方法有哪些?

时间:2010-01-04 13:36:57

标签: android listview caching performance

我的活动中有一个GridView,显示从远程服务器获取的大约30个缩略图。我正在为图像进行2级缓存:

  1. 有一个内存缓存(使用softReferences的HashMap)
  2. 其次,所有提取的图像都写入Sdcard(以避免在内存位图为GC时重新获取)。
  3. 从GridView-Adapter的getView中,我调用Cache类的getCachedImage函数,该函数将返回默认图像或来自其中一个缓存的图像。返回默认图像时,Cache类启动AsyncTask以从远程服务器获取图像。然后,该图像也会写入两个缓存中。

    问题是:当AsyncTask完成时,我希望它还能与缓存一起更新UI。我尝试将GridView子项(ImageView)的实例传递给AsyncTask,然后在AsyncTask的postExecute中设置此子视图的图像,但由于View回收,这种方法导致错误视图中的图像不正确,如果提取需要很长时间。

    有什么方法可以让我的AsyncTask更加主动,这意味着它应该让UI知道图像下载已经完成了?
    谢谢!

2 个答案:

答案 0 :(得分:3)

我使用CWAC-Thumbnail执行的方法是执行您所做的一切,但也会通过ImageViewImageView对象标记中的setTag()显示为当前显示的网址。然后,当AsyncTask结束时,我会检查标记以查看ImageView的网址是否与任务下载的网址相匹配。如果他们这样做,我应用图像。如果没有,我没有。

答案 1 :(得分:0)

处理这种情况的一种方法是简单地编写一个自定义图像视图(继承ImageView),它能够自己处理所有这些东西。

然后您可以将自定义图像视图放在任何需要的地方,只需在其上调用类似“startLoading”的内容即可。 在这个“startLoading”中,只需输入你描述的逻辑。