1.需求背景:
拍照成功后,用glide将图片通过bitmap进行展示,之后点击保存按钮的时候会把图片上传到后端
//glide版本:'com.github.bumptech.glide:glide:4.8.0'该版本load支持直接传入bitmap
Glide.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_8888
at 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);