【发布时间】:2011-12-17 20:03:31
【问题描述】:
我试图更好地了解 Android 如何处理图像以便更有效地使用内存。我有一个图像存储在Bitmap 中,我正在使用ImageView.setImageBitmap() 来显示它。现在的问题是 - 它会使用我将来传递的Bitmap,还是复制它而我创建的Bitmap 在调用setImageBitmap 后不再使用?
假设它会继续引用我通过的Bitmap,那么当Bitmap 是通过BitmapFactory 使用inPurgeable 选项创建时它会如何表现? ImageView 会阻止 Bitmap 暂时从内存中清除吗?是只有在ImageView 具有View.VISIBLE 状态时才会发生,还是在View.GONE 和View.INVISIBLE 时才会发生?或者只有当ImageView 在屏幕上可见时?
还有一件事 - 查看 Android 源代码会发现编码的字节数据总是被复制到内存中(inInputShareable 目前被忽略)。是否计入 Android Java 应用程序的 16/24MB 内存限制?
谢谢
【问题讨论】:
-
我想你可以通过简单的实验来回答你的一些问题。我会说你传递给 setImageBitmap() 的位图是直接使用的。而且,无论视图是否消失,如果它引用它,它永远不会被垃圾收集器销毁。波兹德罗 ;)
-
不幸的是,事情没那么简单。即使 ImageView 保留了对传递的 Bitmap 的引用,但这并不意味着存储在 Bitmap 中的数据不能被清除。根据文档“生成的位图将分配其像素,以便在系统需要回收内存时可以清除它们”,“当需要再次访问像素时(..),它们将被自动重新解码”。我问的是 ImageView 是否会阻止解码的数据被清除,或者在需要时会被清除并重新解码。没有简单的方法可以找出它,它的行为可能取决于几个因素。
-
“当需要再次访问像素时(..),它们将被自动重新解码” - 如果 ImageView 已按原样设置位图,创建运行时,没有任何信息怎么办它是从哪里取来的。如果那是真的,那它就永远消失了。我不这么认为。
-
你又错了。当 Bitmap 通过 BitmapFactory 使用 inPurgeable 创建时(这就是我们正在讨论的情况),编码数据的副本也会被存储。我的印象是你忘记了 Bitmap 是一个包含大量数据的复杂类,而不是一个带有解码图片的简单变量。有关详细信息,请参阅文档:developer.android.com/reference/android/graphics/…
标签: android memory bitmap imageview bitmapfactory