Android系统函数调用方法中Bitmap是否有调用recycle方法的必要性

Android系统中Bitmap是否有调用recycle方法的必要性_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
Android系统中Bitmap是否有调用recycle方法的必要性
我有更好的答案
应该还是有必要的。按我的理解,调用后会要求底层释放内存。因为bitmap的内存占用主要部分是底层分配的。所以调用recycle应该是会建议底层释放内存。
资深电脑人
为您推荐:
其他类似问题
android系统的相关知识
换一换
回答问题,赢新手礼包本帖子已过去太久远了,不再提供回复功能。Android系统中Bitmap是否有调用recycle方法的必要性_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
Android系统中Bitmap是否有调用recycle方法的必要性
我有更好的答案
我觉得是很有必要的,如果不调用recycle这个方法会导致内存泄露,尤其是加载一个很大的图片时,不调用可能会是应用崩溃,同时,调用recycle这个方法也是一种很好的习惯
采纳率:61%
为您推荐:
其他类似问题
android系统的相关知识
换一换
回答问题,赢新手礼包Android系统中Bitmap是否有调用recycle方法的必要性_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
Android系统中Bitmap是否有调用recycle方法的必要性
我有更好的答案
然后在进行相应的recycle,会对系统资源造成负荷。
所以,这个时候还是自己试用recycle来释放的比较好Android系统中Bitmap是否有调用recycle方法的必要性的说明:
Android有自己的垃圾回收机制.getBitmap();/imageView.setImageBitmap(bitmap2);
imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));
/&#47,还的看情况而定;/ 根据原始位图和Matrix创建新的图片
&#47, 0, bitmap1,那必然垃圾回收需要做的次数就更多也发生地更频繁.createBitmap(bitmap1, 0;
// 获得ImageView当前显示的图片
Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground())。
回收例子及代码:
&#47.isRecycled()) {
bitmap1。
1、如果只是使用少量的几张图片,回收与否关系不大.recycle().getWidth(),
bitmap1.getHeight(), matrix, true)!bitmap1; 如果图片还没有回收,强制回收
if (。
2、若有大量bitmap需要垃圾回收处理,一定要注意ImageView图片的来源问题,对于是不是要编程人员自己调用
Bitmap bitmap2 = B
所以
VpnVip资讯教程,软件使用平台。
操作系统/系统故障
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包【Android系统】关于手动回收Bitmap.recycle出现异常
&在Android中,我们在使用Bitmap相关内容的时候,要注意由于Bitmap不同于Drawable,Drawable是封装好的类,所以会有对应的资源回收处理机制。但是对于Bitmap,就没有相关资源回收的处理,为了保证应用正常运行不出现内存泄露,所以我们需要在使用完Bitmap对其进行回收。在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用。在Android2.3时代,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收,而在Android2.3之后,整个Bitmap,包括数据和引用,都放在了堆中,这样,整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了。
但是我们拿到的错误异常信息如下,具体异常的位置为我们自定义的View,在调用draw()方式的地方抛出的:
java.lang.RuntimeException: Canvas: trying to use a recycled
bitmap android.graphics.Bitmap@6dc5652
android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1270)
android.graphics.Canvas.drawBitmap(Canvas.java:1325)
com.mobile.view.MaskWavedView.draw(MaskWavedView.java:121)
android.view.View.updateDisplayListIfDirty(View.java:15381)
android.view.View.draw(View.java:16182)
android.view.ViewGroup.drawChild(ViewGroup.java:3756)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:3546)
android.view.View.updateDisplayListIfDirty(View.java:15373)
android.view.View.draw(View.java:16182)
我们看下异常信息抛出的位置,如下的文件位置,具体抛出异常信息的位置,是在一个隐藏的方法throwIfCannotDraw(),如下:
\frameworks\base\graphics\java\android\graphics\Canvas.java
protected static void throwIfCannotDraw(Bitmap bitmap)
(bitmap.isRecycled()) {
&&&&&&&&&&&
throw new RuntimeException("Canvas: trying to use a recycled bitmap
(!bitmap.isPremultiplied() &&
bitmap.getConfig() == Bitmap.Config.ARGB_8888
&&&&&&&&&&&&&&&
bitmap.hasAlpha()) {
&&&&&&&&&&&
throw new RuntimeException("Canvas: trying to use a non-premultiplied bitmap
&&&&&&&&&&&&&&&&&&&
+ bitmap);
&从这一段代码的执行来看,当Bitmap.isRecycled(),则会抛出"Canvas:
trying to use a recycled bitmap
"的异常信息,而这个throwIfCannotDraw()方法调用的地方,经过搜索,可以看到如下:
public void drawBitmap(@ NonNull Bitmap
bitmap, float left, float top, @Nullable Paint
throwIfCannotDraw(bitmap);
native_drawBitmap(mNativeCanvasWrapper, bitmap, left,
&&&&&&&&&&&&&&&
paint != null ? paint.getNativeInstance() : 0, mDensity,
mScreenDensity, bitmap.mDensity);
public void drawBitmap(@ NonNull Bitmap
bitmap, @Nullable Rect
src, @NonNull RectF
&&&&&&&&&&&
@Nullable Paint
(dst == null) {
throw new NullPointerException();
throwIfCannotDraw(bitmap);
final long nativePaint = paint == null ? 0 :
paint.getNativeInstance();
float left, top, right,
(src == null) {
left = top = 0;
right = bitmap.getWidth();
bottom = bitmap.getHeight();
left = src.
right = src.
top = src.
bottom = src.
native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top, right,
&&&&&&&&&&&&&
dst.left, dst.top, dst.right, dst.bottom, nativePaint,
mScreenDensity,
&&&&&&&&&&&&&
bitmap.mDensity);
public Canvas( @NonNull Bitmap
(!bitmap.isMutable()) {
&&&&&&&&&&&
throw new IllegalStateException("Immutable bitmap passed to Canvas
constructor");
throwIfCannotDraw(bitmap);
mNativeCanvasWrapper = initRaster(bitmap);
mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper);
mDensity = bitmap.mD
可以看到根据我们异常抛出的位置,也就是调了drawBitmap()方法,导致我们传入的Bitmap在被方法throwIfCannotDraw()检测的时候,被判断该Bitmap已被recycle,跟进Bitmap相关代码可以看到如下代码:
public void recycle() {
(!mRecycled
&&&&&&&&&&&
(nativeRecycle( mNativeBitmap)) {
&&&&&&&&&&&&&&&
// return value
indicates whether native pixel object was actually
&&&&&&&&&&&&&&&
// false indicates that
it is still in use at the native level and
&&&&&&&&&&&&&&&
// objects should not
be collected now. They will be collected later when
&&&&&&&&&&&&&&&
// Bitmap itself is
collected.
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
mNinePatchChunk = null ;
&&&&&&&&&&&
&&&&&&&&&&&
public final boolean isRecycled() {
return mRecycled
查了一下我们自己实现的代码,可以看到我们为了防止系统内存泄露,所以在自定义的View的onDetachedFromWindow()的周期方法里面对Bitmap进行了手动的回收释放,调用了recycle()方法,如上面代码所示,Bitmap调用了recycle会调用一个native方法回收内存,然后就会将一个变量mRecycled置成true,而这时候调用isRecycled()返回的结果就是true。所以导致Canvas在draw的时候,Bitmap已经被回收,从而抛出了这个异常“Canvas:
trying to use a recycled bitmap”。
该异常处理方式:修改回收方式,直接将使用的Bitmap置成null,后面的回收处理就交给系统GC来处理,而不直接调用recycle来回收相关的内容。或者try
catch捕获相关异常,避免直接抛出相关内容。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 recycle方法 的文章

 

随机推荐