4

我已经成功实现了 Android listview 中列表图像和列表项的延迟加载。我正在使用 Android 4.0+ 和 Java 7。

我遵循的算法是:

  1. 列表数据(包括图像 URL)在用户滚动列表时从 Internet 下载。

  2. 当滚动状态为空闲时,加载列表图像。

  3. 在后台线程中,首先在缓存中检查图像。如果缓存中不存在,则将它们下载并存储到缓存中。

  4. 最后在 listview 中将 image 设置为 imageview 并通知适配器。

唯一的问题是我不清楚何时回收位图。我尝试在很多地方使用 bitmap.recyle() 但出现以下错误:

java.lang.IllegalArgumentException:无法绘制回收位图

无法在此处添加大量代码。还有一些隐私问题。有人可以帮我解决这个问题吗?

编辑

我的应用程序大小从 727 KB(安装时)增加到 14 MB。回收位图后,在适配器的 getView() 中,我得到“无法从位图生成纹理”。谁能建议如何摆脱它?

4

3 回答 3

2

回收位图会使其无法使用。仅在您完全完成后才能回收。在您的情况下,这意味着在将其从缓存中逐出之后。您还需要确保没有任何现有视图引用它。

于 2013-08-14T20:34:13.733 回答
0

从 ICS 开始,不需要回收。在某些情况下您会想要,但考虑到大多数 listview 实现,它可能不是必需的。

你可以查看 Chet Hasse 的这个视频,了解更多关于重用位图的信息,如果它们是相同的大小会更好。DevBytes:位图分配

于 2013-08-14T20:32:20.913 回答
0

位图回收在不同版本的 Android 中应该有不同的执行方式。最好以涵盖大多数版本的方式实施。

正如其他人所说, recycle() 使您的位图不可用, recycle() 意味着在您完成位图并希望引发垃圾收集后使用。我认为你应该在你的活动 onPause()/onStop() 中使用它。

有关更多信息,请参见此处: 管理位图内存

于 2016-03-19T20:17:34.340 回答