【问题标题】:Android bitmap recycle: need to set null?Android位图回收:需要设置null吗?
【发布时间】:2020-09-23 04:04:52
【问题描述】:

是否需要在回收后设置一个Bitmapnull,以便释放其内存?

在以下代码中:

private static Bitmap bmpConcatHV() {
    Bitmap bmp = BitmapFactory.decodeResource(resId);
    Bitmap bmp2 = concatVertically(bmp, bmp);
    bmp.recycle();
    bmp = null;
    Bitmap bmp3 = concatHorizontally(bmp2, bmp2);
    bmp2.recycle();
    bmp2 = null;
    return bmp3;
}

Lint警告:

从未使用分配给“bmp”的 null 值

从未使用分配给“bmp2”的 null 值

【问题讨论】:

    标签: android android-bitmap recycle


    【解决方案1】:

    bmpbmp2 都是局部变量,所以不是。

    【讨论】:

    • 也许 bmp1 的内存应该在 bmp3 的内存分配之前被释放。
    • 非常好。在这种情况下,您还调用recycle,据我了解,文档将确保内部图像数据可以被垃圾收集,假设没有其他对内部图像数据的引用。但仍然。
    • 我想我可能回答的问题与您提出的问题不同;我想到的是reg。确保 bmpbmp2 最终被垃圾回收,因为它们是局部变量(同样Bitmap 的文档描述了它们不需要手动释放,因为垃圾回收也会释放内部零件)。但是您可能(明智地)更担心提前发布,因为图像会占用大量内存,而 Android 上的内存通常是有限的。
    • 提前释放由你调用recycle处理,局部变量中的引用不会妨碍内部图像数据的垃圾回收。
    【解决方案2】:
    BitmapFactory.decodeResource(resId);
    

    位图加载到内存时有两部分信息 1-有关位图的信息==>存在于java已用内存中 2-有关位图像素的信息(数组字节)==>存在于c++已用内存中

    Bitmap.recycle() 用于释放 C++ 的内存。 Garbage Collection会收集java的部分和内存

    垃圾收集在需要内存时工作,但我现在需要使用此引用,所以将使用

    bmp = null; here i handle the part of java and be safe to make it null
    

    【讨论】:

    • android.googlesource.com/platform/frameworks/base.git/+/… 中,似乎既有用于图像数据的 Java 缓冲区,也有本地缓冲区,recycle 处理两者。但好点注册。本机部分。
    • 我还要说recycle 用于比其他方式更早地释放内存,因为文档描述它不需要这样调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多