何时在android项目中回收位图?

时间:2013-08-14 20:26:42

标签: java android bitmap recycle

我已在Android列表视图中成功实施了列表图片和列表项的延迟加载。我使用的是Android 4.0+和Java 7。

我遵循的算法是:

  1. 当用户滚动列表时,列表数据(包括图像URL)将从互联网上下载。

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

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

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

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

    java.lang.IllegalArgumentException:无法绘制循环位图

    在这里添加大量代码是不可能的。还有一些隐私问题。有人可以帮我解决这个问题吗?

    修改

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

从ICS开始,没有必要回收利用。有几个例子你想要,但考虑到大多数listview实现它可能没有必要。

有关重复使用位图的更多信息,请查看Chet Hasse的视频,如果它们的大小相同则会更好。 DevBytes: Bitmap Allocation

答案 2 :(得分:0)

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

正如其他人所说,recycle()会使您的位图无法使用,一旦您完成位图并想要引入垃圾回收,就会使用recycle()。我认为你应该在你的活动onPause()/ onStop()上使用它。

有关更多信息,请参阅此处: Managing Bitmap Memory