Android NoteX Q8:Glide竟然發生了Cannot draw recycled bitmaps?

一 場景還原

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。