【问题标题】:Recycling bitmaps回收位图
【发布时间】:2012-07-10 05:26:53
【问题描述】:

我正在从事涉及位图操作的项目。因为我不想有 OutofMemoryError 我正在尝试回收每个未使用的位图。不幸的是,我已经回收了太多并且“尝试使用回收的位图”错误。

我正在使用:

 Bitmap.createBitmap(bmp, x,y,w,h, matrix, false);
 Bitmap.createScaledBitmap(bmp, w, h,true);

我应该在这些方法之后回收 bmp 还是由他们回收?喜欢:

Bitmap newBitmap = Bitmap.createBitmap(bmp, x,y,w,h, matrix, false);
bmp.recycle();

我可以在 imageView.setImageBitmap() 之后回收之前在这里使用的一个吗?例如

myImageView.setImageBitmap(myBitmap);
myImageView.setImageBitmap(newBitmap);
myBitmap.recycle();

感谢您的帮助。

【问题讨论】:

  • 在创建位图时考虑使用 BitmapFactory.Options。具体看inPurgeable...developer.android.com/reference/android/graphics/…
  • “尝试使用回收的位图”是您看到的关于回收位图的确切且唯一的错误吗?如果是,可能值得尝试分析您的堆栈跟踪并查看是否可以在错误发生时检测到模式(框架中有一个中心位置会引发此异常,尽管您的代码有很多方法可以到达那里)。

标签: android memory-management bitmap out-of-memory


【解决方案1】:

您应该只在不再需要时回收位图。但是,当您想要显示位图时,您确实需要位图。如果不想显示,可以回收位图。

【讨论】:

  • 所以这是一个好习惯:myImageView.setImageBitmap(myBitmap); newBitmap = Bitmap.createBitmap(myBitmap,x,y,w,h, 矩阵, false); myImageView.setImageBitmap(newBitmap); myBitmap.recycle();?
  • 不,它不起作用并给你一个例外,因为你的位图在被渲染之前会被回收。调用 setImageBitmap 不会立即将位图渲染到屏幕上。这会在下一个 UI 更新周期的某个未来时间点发生。即使那样你也需要保留你的位图,因为你把它分配给了你的 ImageView。只要您不再使用 ImageView 或设置不同的位图,您就可以回收旧位图。在 Activity.onStop() 中可以安全地回收所有旧位图。你也可以使用 onPause 但你必须在 onResume 中重新创建它们
  • 但在我的示例中有两个位图:myBitmap(原始)和 newBitmap。我想在创建 newBitmap 并将其设置为 imageView 后尽快回收 myBitmap。
  • 哦,我的错,对不起。我今天应该休息一下:-) ...你是对的,你的例子是很好的做法。
  • 别担心 :) 我还有一个问题。你说过:“调用 setImageBitmap 不会立即将位图渲染到屏幕上。这会在下一个 UI 更新周期的某个未来时间点发生。”所以关于我的例子,我仍然可以在 setImageBitmap(newBitmap) 之后使用 recycle()?
【解决方案2】:

您只需在使用完位图并确保您永远不需要再次使用其中的数据后才能回收位图。在处理位图时,您可以在任何您喜欢的地方使用它,这不是一种神奇的方法,可以为您提供更多内存。

【讨论】:

    【解决方案3】:

    当我想缩放位图时,我使用相同的参考:

    Bitmap bmp = Bitmap.createBitmap(bmp, x,y,w,h, matrix, false); 
    

    当第一个位图对象丢失其引用“bmp”时,它会被 GC(垃圾收集器)删除,因此您无需回收任何东西。至于图像视图,它仅将其源引用到“newBitmap”,它不会创建自己的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2012-07-20
      • 2015-06-21
      • 2012-08-09
      • 2018-11-17
      • 2012-10-31
      • 2015-07-18
      • 1970-01-01
      相关资源
      最近更新 更多