一 场景还原
在多个页面(Activity)中加载了同一gif资源,退出部分Activity后报出了如题错误。
Glide.with(this)
.asGif()
.placeholder(contentIv!!.drawable)//解决切换图片闪烁问题
.load(resId)
.listener(object : RequestListener<GifDrawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<GifDrawable>?,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: GifDrawable?,
model: Any?,
target: Target<GifDrawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
return false
}
}).into(contentIv!!)
二 疑问解析
疑问
既然context使用的是this,若是改为application级别的context让glide不去回收资源,是否不会发生这样的错误呢?(因为可以猜测:application级别的context生命周期是整个应用,而不是activity 进行finish时就去回收资源)
结果:仍旧出现了同样的问题。说明问题的症结点不在这里。
三 解决方案
换个思路,cannot draw recyled bitmaps,那就意味着——>
在使用资源时,发现资源已经被回收了。
因此,只要确保在使用资源时资源还在就行了。
Glide.with(context.applicationContext)
.asGif()
.placeholder(contentIv!!.drawable)//解决切换图片闪烁问题
.load(resId)
.into(object : CustomTarget<GifDrawable>() {
override fun onLoadCleared(placeholder: Drawable?) {
super.onLoadFailed(placeholder)
}
override fun onResourceReady(
resource: GifDrawable,
transition: Transition<in GifDrawable>?
) {
var placeHolderBitmap = resource.firstFrame.toDrawable(resources)
Glide.with(context.applicationContext)
.asGif()
.load(resId)
.placeholder(placeHolderBitmap)
.into(contentIv!!)
}
})
因此,在onResourceReady回调中去加载资源即可。
四 总结
该类问题有时候也会出现在RecycleView的资源图片加载的情况中。
碰到此类问题,有时候可能一时之间无法从原理由远及近来解决(分析为什么会回收——>怎样防止回收——>...),换个思路从最直接的面切入可能会更快速一点(要使用的时候是没有资源,那确保有资源可用或者无资源不用即可)。
当然,若是深入学习,对原理的分析与了解还是需要的。
(5.1哈皮假期😄)