问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android bitmap集合怎么释放,直接clear,可以吗

发布网友 发布时间:2022-05-14 18:08

我来回答

1个回答

热心网友 时间:2023-10-19 10:50

今天来研究一下android中的Bitmap。在实际开发中,Bitmap经常用到,特别是游戏开发。可以说游戏开发其实就是对图片(Bitmap)操作!可见Bitmap有多重要。这里我们主要讨论的是Bitmap资源释放原理。
我们知道,用完一个Bitmap后,需要马上recycle()来保证尽快释放期资源。首先,我们来看看recycle()这个函数的定义(Bitmap.java):

[java] view plaincopy
public void recycle() {
if (!mRecycled) {
if (nativeRecycle(mNativeBitmap)) {
// return value indicates whether native pixel object was actually recycled.
// false indicates that it is still in use at the native level and these
// objects should not be collected now. They will be collected later when the
// Bitmap itself is collected.
mBuffer = null;
mNinePatchChunk = null;
}
mRecycled = true;
}
}
代码很简单,主要调用这个函数:nativeRecycle(mNativeBitmap)去释放。这里是JNI方式去调用了c写的方法!其实,你看看一下Bitmap这个类,就知道了,其实Bitmap的实现主要都是用C写的,为了保证效率这样选择是必然的! 这不是我们讨论的重点。我们来看看google给这个函数的一段说明:

[java] view plaincopy
/**
* Free the native object associated with this bitmap, and clear the
* reference to the pixel data. This will not free the pixel data synchronously;
* it simply allows it to be garbage collected if there are no other references.
* The bitmap is marked as "dead", meaning it will throw an exception if
* getPixels() or setPixels() is called, and will draw nothing. This operation
* cannot be reversed, so it should only be called if you are sure there are no
* further uses for the bitmap. This is an advanced call, and normally need
* not be called, since the normal GC process will free up this memory when
* there are no more references to this bitmap.
*/
通过这段说明我们知道调用这个函数其实只是会free一些相关的资源、对于其t图片像素数据并没有同步释放,而且这个方法通常也不是必要的,就是说:不是一定要调用这个函数这个Bitmap才会被GC回收。那么问题就来了:刚才说了,那图片像素这类数据是如何释放的呢?最重要的是bitmap处理的核心代码不是JAVA写的。

这个时候finalize()就登场了。我们先看看里面定义的一个私有变量private final BitmapFinalizer mFinalizer; BitmapFinalizer 是Bitmap的内部类:

[java] view plaincopy
private static class BitmapFinalizer {
private final int mNativeBitmap;

BitmapFinalizer(int nativeBitmap) {
mNativeBitmap = nativeBitmap;
}

@Override
public void finalize() {
try {
super.finalize();
} catch (Throwable t) {
// Ignore
} finally {
nativeDestructor(mNativeBitmap);
}
}
}
这里很好的利用object的finalize()这个回调函数,安卓博客http://www.bafenbaosoft.com 这样就来保证一个Bitmap对象被释放的时候能够回调void nativeDestructor(int nativeBitmap);这个函数来释放C里面申请的资源!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 顺丰邮寄快件 不给开增值税专用发票,有条件吗 在Android中 集合怎么声明 android 集合new完对象为null吗 请问卤牛肉怎么做的 牛肉怎么卤才好吃 怎样做卤牛肉家常做法 蚝油牛肉 怎么做 主要是牛肉怎么卤一下 今天天气预报怎么说? 为什么我的手机今天还显示昨天的天气预报? 牦牛肉怎么卤好 怎样卤牦牛肉 全球变暖是不是意味着冬天会变暖? 为什么文明早期黄河中下游流域气温比现在高? 帮忙翻译一下,谢谢,英语翻译 懂英文的来,不要翻译器翻译的,我自己都有,要真人的!~ 求《亚历山大大帝》完整版!1080p的!非常感谢! King Richard 的英文介绍 as summer is approaching 和with summer approa 油桉树最底温度多少度会冻死? 议论文以自强不息为题目 Android中如何在两界面间传递下面的集合? android list集合中有相识查找的方法吗 android parcelable对象中有集合怎么写 android list集合中多个耗时操作如何执行 请问怎样从一个android 对象集合中遍历并获取对象? 安卓是不是是可以理解为apk的集合 android recyclerview 怎么适配两个list集合 android怎么动态监听arraylist集合的变化 jquery代码写在哪里 本人因学设计,需做VR渲染,不知道自己的电脑配置够不够,请各路大神进来帮忙看看! 这样的电脑配置可以运行3ds max 和VR渲染? 做3D用VR渲染效果图的电脑配置,急急急 用3ds maxs建模和vray渲染,电脑需要什么样的配置比较合适? 谁能帮我配台专门用于3DMAX建模+VR渲染效果图的电脑配置单? 做3D动画用3dmax VRay渲染器应该什么电脑配置?请大家给一个配置单? 3DMAX+VR 效果图电脑配置 儿童牛奶是真的牛奶吗? 二岁半的小孩喝纯牛奶好还是喝儿童牛奶好 德国十大手表品牌大全lN4501 德国手表品牌大全