Caused by: java.lang.IllegalStateException: Cannot pool recycled bitmap
at com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool.put(LruBitmapPool.java:86)
at com.bumptech.glide.load.resource.bitmap.BitmapResource.recycle(BitmapResource.java:57)
at com.bumptech.glide.load.engine.EngineResource.recycle(EngineResource.java:63)
at com.bumptech.glide.load.engine.ResourceRecycler.recycle(ResourceRecycler.java:28)
at com.bumptech.glide.load.engine.Engine.onResourceReleased(Engine.java:319)
at com.bumptech.glide.load.engine.EngineResource.release(EngineResource.java:101)
at com.bumptech.glide.load.engine.Engine.release(Engine.java:275)
at com.bumptech.glide.request.SingleRequest.releaseResource(SingleRequest.java:290)
at com.bumptech.glide.request.SingleRequest.clear(SingleRequest.java:269)
at com.bumptech.glide.manager.RequestTracker.clearRemoveAndRecycle(RequestTracker.java:62)
at com.bumptech.glide.RequestManager.untrack(RequestManager.java:437)
at com.bumptech.glide.RequestManager.untrackOrDelegate(RequestManager.java:424)
at com.bumptech.glide.RequestManager.clear(RequestManager.java:412)
at com.bumptech.glide.RequestManager.onDestroy(RequestManager.java:272)
at com.bumptech.glide.manager.ActivityFragmentLifecycle.onDestroy(ActivityFragmentLifecycle.java:64)
at com.bumptech.glide.manager.SupportRequestManagerFragment.onDestroy(SupportRequestManagerFragment.java:187)
at android.support.v4.app.Fragment.performDestroy(Fragment.java:2609)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1557)
参考文献:https://www.jianshu.com/p/e7204506a9bb
Glide源码:
@Override
public synchronized void put(Bitmap bitmap) {
if (bitmap == null) {
throw new NullPointerException("Bitmap must not be null");
}
if (bitmap.isRecycled()) {
throw new IllegalStateException("Cannot pool recycled bitmap");
}
if (!bitmap.isMutable() || strategy.getSize(bitmap) > maxSize
|| !allowedConfigs.contains(bitmap.getConfig())) {
bitmap.recycle();
return;
}
final int size = strategy.getSize(bitmap);
strategy.put(bitmap);//存入LruPoolStrategy中
tracker.add(bitmap);
puts++;
currentSize += size;
dump();//输出log信息
evict();//根据currentSize计算是否超出maxSize,是则进行末位回收
}
通过阅读源码,第二个语句
if (bitmap.isRecycled()) {
throw new IllegalStateException("Cannot pool recycled bitmap");
}
大致意思是用来加载的bitmap被回收了,所以会报异常,按照这个思路,我检查自己的代码,发现确实当界面销毁的时候,我们的代码在Glide之前,主动回收了Bitmap,所以导致抛异常,所以解决办法很简单,只需要把自己主动回收的代码去除就好
image.png
如果你的代码也出现此问题,只需要搜索主动回收的代码recycle,注释掉即可,或者别用Glide,至于被回收会报异常出来,代码君还未读Glide里面的源码,不敢过分解读~,有了解的小伙伴可以在评论区里答疑一下
网友评论