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哈皮假期😄)

共同学习、探讨

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值