Android NoteXAndroid开发学习

Android NoteX Q8:Glide竟然发生了Canno

2021-04-30  本文已影响0人  不会飞的小猪

一 场景还原

在多个页面(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哈皮假期😄)

上一篇 下一篇

猜你喜欢

热点阅读