【问题标题】:Android ImageView setImageBitmapAndroid ImageView setImageBitmap
【发布时间】:2011-12-17 20:03:31
【问题描述】:

我试图更好地了解 Android 如何处理图像以便更有效地使用内存。我有一个图像存储在Bitmap 中,我正在使用ImageView.setImageBitmap() 来显示它。现在的问题是 - 它会使用我将来传递的Bitmap,还是复制它而我创建的Bitmap 在调用setImageBitmap 后不再使用?

假设它会继续引用我通过的Bitmap,那么当Bitmap 是通过BitmapFactory 使用inPurgeable 选项创建时它会如何表现? ImageView 会阻止 Bitmap 暂时从内存中清除吗?是只有在ImageView 具有View.VISIBLE 状态时才会发生,还是在View.GONEView.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


【解决方案1】:

看看这篇文章:http://developer.android.com/training/displaying-bitmaps/index.html

有一些有用的课程可以帮助你更好地理解 android 的内存管理

【讨论】:

  • 请注意,link-only answers are discouraged,SO 答案应该是搜索解决方案的终点(相对于另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
  • 好吧,最初我试图发表评论而不是这样的答案。然而这个网站对新用户根本不友好,50 声望只是为了评论?天哪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多