前言:
随着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以上就是我想讲的三点,后续如果还有深入学习,再进行补充。
网友评论