为什么我不使用BitmapFactory的inPurgeable选项?

时间:2011-08-15 17:10:47

标签: android bitmap

various places建议使用Android BitmapFactory.Options.inPurgeable作为避免Android 2.x及更早版本(Android 3.1 fixes this)中的OutOfMemory异常的方法。

如果inPurgeable如此之大,为什么我不想使用它?关于此选项正在做什么的详细信息,documentation似乎非常清楚:

  

如果将其设置为true,则生成的位图将分配其像素,以便在系统需要回收内存时可以清除它们。在这种情况下,当需要再次访问像素时(例如,绘制位图,调用getPixels()),它们将被自动重新解码

看起来很棒。有什么收获?

4 个答案:

答案 0 :(得分:9)

documentation随后已更新,其中包含解决原始问题的其他信息。

摘要:不再推荐使用此标志。

答案 1 :(得分:4)

如果您正在从文件系统读取位图,则使用此标志将强制Android保持文件打开(至少在4.0.4中)以便能够重新读取它。读取超过1024个文件后,您将达到打开文件的限制并获得“打开文件太多”错误。

您可以使用来自有根终端的lsof命令观察行为,并查看所有已打开的文件。

答案 2 :(得分:2)

此标志目前完全被忽略,这就是捕获。


@slodge更新:请任何阅读此内容并将其视为正确答案的人也阅读评论 - “此标志目前完全被忽略”仅在某些情况下是正确的 - 在其他情况下(例如使用时{{ 1}}关于下载的数据)然后这个标志不被忽略,非常非常有用

答案 3 :(得分:1)

  

要进行重新解码,位图必须能够访问编码数据,方法是共享对输入的引用或复制它。

如果您无法再访问编码数据,那么这可能是个问题吗?如果您正在从流式ByteArray实时解码位图并且您的应用程序决定回收内存,那会不会导致您的Bitmap丢失这些像素,该怎么办?