【问题标题】:When (if at all) should I use Bitmap.recycle()?什么时候(如果有的话)我应该使用 Bitmap.recycle()?
【发布时间】:2012-06-27 11:23:24
【问题描述】:

根据 Android Developers 网站,Bitmap.recycle() 方法定义为:

释放与该位图关联的原生对象,并清除对像素数据的引用

我开发了一些创建/解码大量位图的应用程序,并将结果位图对象放到ImageViews。有时我会遇到一些著名的例外情况,例如:

位图大小超出虚拟机预算

内存不足错误

此外,我确定我没有任何可能导致这种情况的内存泄漏。

经过大量搜索,我发现了“回收”方法,并在不再需要时使用它来释放位图的本机内存。 好像帮了很多忙

我想问在这种情况下我是否应该这样做,因为 我知道系统在没有明确调用它的情况下无论如何都会这样做(是吗?也许我错了)。

我应该在这种情况下使用这种方法吗?

在什么情况下我应该使用这种方法?

我应该使用这种方法吗?

提前致谢。

更新:

google 最近发布了this 指南,上面写着:

在 Android 2.3.3(API 级别 10)及更低版本上,建议使用 recycle()。如果您在应用程序中显示大量位图数据,您可能会遇到 OutOfMemoryError 错误。 recycle() 方法允许应用尽快回收内存。

【问题讨论】:

  • 无需致电recyle。它可以提供帮助,但前提是您正确使用它。实际上,为您的 Bitmap 对象创建一个 WeakReference 并返回它要容易得多。 You should watch this Google IO talk
  • @aneal:谢谢,很久以前就看过那个视频了。

标签: android bitmap garbage-collection out-of-memory android-imageview


【解决方案1】:

在什么情况下我应该使用这种方法?

位图在 GC 决定时由 GC 进行 GC。但在某些情况下它可能会延迟。 并且永远记住java中的拇指规则(也许它也适用于其他PL)。GC回收对象的速度可能与创建对象的速度不同。所以有时GC回收速度很慢。

所以 recycle() 意味着如果你想尽快释放内存,你应该调用 recycle()

我应该使用这种方法吗??

这是一个高级调用,通常不需要调用,因为当没有更多对该位图的引用时,正常的 GC 过程会释放该内存。但是如果您遇到诸如 位图大小超出的问题vm预算内存不足错误那么你需要使用这个。

【讨论】:

    【解决方案2】:

    我确实在我知道不再使用位图的操作中使用它。

    public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) {  
        Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied);
        Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888);
        final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight());
        final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight());
        Canvas canvas = new Canvas(output);
    
        Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        xferPaint.setColor(Color.BLACK);
    
        xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
    
        canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null);
        canvas.drawBitmap(mask, originRect, originRect, xferPaint);
    
        contactImageBitmap.recycle();
        mask.recycle();
    
        return output;
      }
    

    在这样的地方,我确定我不会使用面具或contactImage。

    我找到了一个非常有用的位图处理资源Displaying bitmaps

    问候, 亚历克斯

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 2010-10-08
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2021-09-07
      相关资源
      最近更新 更多