Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX
近期在做和图片相关显示的出现了一个问题,整理一下思路。分享出来给大家參考一下:
Exception Type:java.lang.RuntimeException
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXXXX at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1282)
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:599)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:538)
at android.widget.ImageView.onDraw(ImageView.java:1176)
at android.view.View.draw(View.java:15285)
at android.view.View.updateDisplayListIfDirty(View.java:14208)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15288)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at android.view.View.updateDisplayListIfDirty(View.java:14208)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.updateDisplayListIfDirty(View.java:14203)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.updateDisplayListIfDirty(View.java:14203)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.updateDisplayListIfDirty(View.java:14203)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.updateDisplayListIfDirty(View.java:14203)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.updateDisplayListIfDirty(View.java:14203)
at android.view.View.getDisplayList(View.java:14230)
at android.view.View.draw(View.java:15013)
at android.view.ViewGroup.drawChild(ViewGroup.java:3409)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15288)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2799)
at android.view.View.updateDisplayListIfDirty(View.java:14208)
at android.view.View.getDisplayList(View.java:14230)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2552)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2368)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1998)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5966)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:786)
at android.view.Choreographer.doCallbacks(Choreographer.java:599)
at android.view.Choreographer.doFrame(Choreographer.java:569)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:772)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
基本的跟踪方向
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:599)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:538)
at android.widget.ImageView.onDraw(ImageView.java:1176)
在这ImageView和BitmapDrawable、GLES20Canvas三个类报出异常信息。在找到ImageView代码中,发现了OnDraw的方法的mDrawable.draw(canvas);这一句出现了错
有接着在BitmapDrawable的OnDraw方法发现了错误行canvas.drawBitmap(bitmap, null, mDstRect, paint);:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
又相应在找到GLES20Canvas.java:599的问题:
立即找到了问题所在:
protected static void throwIfCannotDraw(Bitmap bitmap) {
if (bitmap.isRecycled()) {
throw new RuntimeException("Canvas: trying to use a recycled bitmap " + bitmap);
}
if (!bitmap.isPremultiplied() && bitmap.getConfig() == Bitmap.Config.ARGB_8888 &&
bitmap.hasAlpha()) {
throw new RuntimeException("Canvas: trying to use a non-premultiplied bitmap "
+ bitmap);
}
}
因此:能够说明:假设bitmap对象已经被回收了,可是BitmapDrawable的对象还在Canvas上绘制导致了跑出了该异常情况。
解决方式:
1、能够写一个集成ImageView的子类,单后复写onDraw()方法捕获此异常:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
try{
super.onDraw(canvas);
}catch(Exception e){
}
}
2、在使用BitmapDrawable对象的时候能够,进行先将传递的bitmap对象推断。并在显示图片之前不要进行回收,直到使用完在回收。这样的不建议,由于图片多会出现OOM
Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX的更多相关文章
- 关于bitmap recycle trying to use a recycled bitmap android.graphics.Bitmap
在开发中,一直使用4.0以上手机作为測试机所以一直没有出现这个问题,今天换了2.3版本号的手机.出现了这个错误: trying to use a recycled bitmap android.gra ...
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230
近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: t ...
- Android java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230
近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: t ...
- int android.graphics.Bitmap.getRowBytes()
int android.graphics.Bitmap.getRowBytes() Return the number of bytes between rows in the bitmap's pi ...
- void android.graphics.Bitmap.recycle()
void android.graphics.Bitmap.recycle() Free up the memory associated with this bitmap's pixels, and ...
- Android Bitmap操作问题之Canvas: trying to use a recycled bitmap
一.Bitmap.recycle 方法被弃用 在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用.在Android2.3时代,Bitmap的引用是 ...
- Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理
在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map<String ...
- 关于android 使用bitmap的OOM心得和解决方式
android开发,从2010年開始学习到如今的独立完毕一个app,这漫长的四年,已经经历了非常多次bug的折磨.无数次的加班训练.然而,自以为自己已经比較了解android了,却近期在一个项目上.由 ...
- Android中 Bitmap Drawable Paint的获取、转换以及使用
比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...
随机推荐
- cuda输出
cuda的输出就是printf 可以在屏幕上显示出来,但你修改之后一定要make编译,不然只是修改了源代码,但生成的可执行文件还是之前编译的
- vuec常用插件
1. 实现下拉刷新和下拉加载效果 iscroll-probe.js 2.手势密码插件 patternLock.js 3.实现复制 clipboard.min.js
- JavaSE-08 封装
学习要点 封装 访问控制符 包 封装 没有封装的代码有何缺陷? 例如:对狗狗的健康值赋值为-100.如何避免?——使用封装. 封装的概念 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该 ...
- Json Web Token(JWT)详解
什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...
- NOIp十连测 涂色游戏
[问题描述]小A 和小B 在做游戏.他们找到了一个n 行m 列呈网格状的画板.小A 拿出了p 支不同颜色的画笔,开始在上面涂色.看到小A 涂好的画板,小B 觉得颜色太单调了,于是把画板擦干净,希望涂上 ...
- 87-Moving average of oscillator,移动平均振荡指标.(2015.7.4)
Moving average of oscillator 移动平均振荡指标 ~计算: OSMA = MACD-SIGNAL 注释:OSMA的值即为MACD中两个主要指标线的差值 ~思想: 该指标当作一 ...
- NOI模拟(3.6)Assignment
Description 随机生成一个长度为m且每个元素都为1~n之间的整数的单调不下降序列~(即序列的(i>1)都不小于),(随机生成指每一种可能的序列都等概率被生成).请问这个序列的众数出现次 ...
- Spring 事物注解属性
@Transactional属性 . propagation 事物的传播属性 . isolation 事物的隔离属性 . readonly 设置只读属性 . timeout 设置超时属性 . roll ...
- 关于OPENSSL的EVP函数的使用
4月份没什么做,就是做了OPENSSL的 加密和解密的应用,现在公开一下如何调用OPENSSL对字符串进行加密和解密,当中也学会了对加密数据进行BASE64编码,现在公开一下代码,在这感谢GITHUB ...
- Linux下汇编语言学习笔记43 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...