BUG1-Cannot obtain size for recycled Bitmap
1.需求背景:
拍照成功后,用glide将图片通过bitmap进行展示,之后点击保存按钮的时候会把图片上传到后端
//glide版本:'com.github.bumptech.glide:glide:4.8.0'该版本load支持直接传入bitmapGlide.with(this).load(bitmap).into(mIvGlide);
2.BUG复现步骤:
点击保存按钮后,app闪退,并提示如下错入:
Caused by: java.lang.IllegalStateException: Cannot obtain size for recycled Bitmap: android.graphics.Bitmap@fb72974[1411x720] ARGB_8888at com.bumptech.glide.util.Util.getBitmapByteSize(Util.java:78)at com.bumptech.glide.load.resource.bitmap.UnitBitmapDecoder$NonOwnedBitmapResource.getSize(UnitBitmapDecoder.java:49)at com.bumptech.glide.load.resource.bitmap.LazyBitmapDrawableResource.getSize(LazyBitmapDrawableResource.java:79)at com.bumptech.glide.load.engine.EngineResource.getSize(EngineResource.java:60)at com.bumptech.glide.load.engine.cache.LruResourceCache.getSize(LruResourceCache.java:42)......
3.定位原因:
通过报错日志可以发现,是因为bitmap已经被回收,当我门关闭页面时,glide也会回收该bitmap,因为他此前已经被回收,所以glide在使用bitmap进行操作时闪退。
解读过报错日志,去项目中查找代码,发现bitmap做成了一个全局变量,当点击保存按钮时,对bitmap进行了一系列操作,最终回收了bitmap,这就 导致了,当页面关闭时,glide已经无法使用传进来的bitmap,最终导致报错。
4.解决方案:
//根据单一职责原则,将bitmap复制一份,只用来做展示操作Bitmap bitmap = new ClipBitmapUtils().getBitmap(this,R.drawable.ic);//复制一份bitmap,避免加载bitmap后,bitmap被回收Bitmap bitmap2 = Bitmap.createBitmap(bitmap);Glide.with(this).load(bitmap2).into(view);
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
