一 場景還原
在多個頁面(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哈皮假期??)