美文网首页
Coil如何暂停和恢复加载

Coil如何暂停和恢复加载

作者: 机器大娃 | 来源:发表于2023-06-20 17:35 被阅读0次

    前言:

    随着kotlin的普及,Coil图片加载框架被更多人使用,但使用过程中也许会碰到些疑惑,如:如何暂停和恢复图片的加载?
    Coil的基础使用,官网已经写的很清楚了,不再过多介绍,这里主要讲三点:
    1.Coil初始化ImageLoader的几种方式。
    2.Coil如何暂停和恢复图片加载。
    3.crossfade(true)带来的问题。

    一.Coli初始化ImageLoader的几中方式

    我们从ImageView.load(url)出发看源码,

    从上诉代码可以看到,ImageLoader最终从newImageLoader(context: Context)方法获得,首先判断imageLoader是否有值,其次imageLoaderFactory是否为null,再判断Application是否实现ImageLoaderFactory接口,如果以上都不满足条件,会帮我们创建个ImageLoader(context)。
    所以,初始化ImageLoader有4种方式:
    1.调用Coil的setImageLoader(imageLoader: ImageLoader)
    2.调用Coil的setImageLoader(factory: ImageLoaderFactory)
    3.调用Application去实现newImageLoader(),如下图:

    4.什么都不做,用默认帮我们生成的类,不过这样子的话,我们就没办法自行配置

    二.Coil如何暂停和恢复图片加载。

    在某些情况,比如,Glide和RecyclerView配合使用时,当RecyclerView滚动或拖动时,为了提升性能,我们会调用Glide.with(context).pauseRequests()来暂停图片加载,滚动停止后调用Glide.with(context).resumeRequests()来恢复加载,然而,Coil并没有提供类似的方法,所以我们得换个思路来做,即,利用Coil的拦截器,来延迟执行图片的请求操作。
    首先介绍下CompletableDeferred ,CompletableDeferred是 Kotlin 协程库中的一个类,用于表示一个可完成(completable)的延迟计算或异步操作。它是Deferred接口的一个具体实现。
    CompletableDeferred的主要作用是允许在协程中启动一个异步操作,并提供一种手段来等待该操作的完成并获取结果。

    看代码:

    拦截器以及暂停恢复相关代码 ImageLoader的初始化

    以上代码都已做备注,若有更好的方案,可留言提出。

    三.crossfade(true)带来的问题。

    在设置crossfade(true)后,首次加载图片,即非从缓存读取时,ImageView获取到的Drawable是一个CrossfadeDrawable,所以,当你对Drawable做处理时,比如重写setImageDrawable对drawable进行转换,需要特别注意下。

    重写setImageDrawable

    以上就是我想讲的三点,后续如果还有深入学习,再进行补充。

    相关文章

      网友评论

          本文标题:Coil如何暂停和恢复加载

          本文链接:https://www.haomeiwen.com/subject/zgoyydtx.html