Coli的源码
Coli的使用
引入依赖
implementation("io.coil-kt:coil:2.4.0")
基本使用
// 图片资源 model --- Any 可以时 网络资源 图片url 和 本地资源drawable等
AsyncImage(model = "图片地址url" , contentDescription ="无障碍图片描述" )
AsyncImage
点击方法
requestOf
我们可以点进model相关的 requestOf(model)
看他是如何处理
如果是ImageRequest 直接返回model。 防止多次重复加载
不是ImageRequest。返回new ImageRequest一个对象。
我们点进ImageRequest.Builder(LocalContext.current)
中的 Builder()
方法,这里是初始化一系列请求参数,返回参数,图片相关的(大小,modify相关等)以便于后面 网络操作还是本地资源获取图片设置的初始化参数
所以这里将 图片信息放到ImageRequest 对象中。
updateRequest
将图片大小和ImageRequest的信息 保存到 ImageRequest中
rememberAsyncImagePainter
点进 rememberAsyncImagePainter
方法
requestOf
是我们刚刚看过的方法 将model 数据 传入
当没有build的 时候 。ImageRequest 刚创建的对象。 抛出异常
AsyncImagePainter
用于图片获取 等一系列的动作的对象
onRemembered()
这里我们看到 异步获取操作。scope.launch{}
这里是通过ImageLoader去加载 图片的
ImageLoader
点进execute 方法
execute
将执行结果同步到主线程
点进 executeMain
executeMain
前部分是 获取请求,创建回调,设置图片转成Bitmap等一系列参数
这一部分是具体
result 为具体的操作。
在RealInterceptorChain
中的 interceptors
点进去
我们能看到创建了 components
对象
这个对象 有一系列的 获取图片资源框架
mapper:请求头
key : 是文件还是
fetcher : 获取数据
decoders :生成图片
网络获取图片 —三级缓存
HttpUriFetcher
获取图片
点进去看fetch()
看获取逻辑
分析出来有资源
第一个 if 语句 第一次从在内存缓存中有 图片信息 metadata 返回
第二个 if 语句 第二次从内存卡Sdcard 中获取
下面esle 是从 第三次没有从网络缓存中获取 图片
下面 else 创建新的网络请求
网络请求后的操作。
点进executeMain 中的 result 的 队列request 的 proceed()
点进 interceptors的intercept方法
缓存相关的 1,2,3级缓存具体操作
我们找到网络相关的
val result = execute(request, mappedData, options, eventListener)
点进去execute
找到fetch()
对应着图片各种获取的资源的方法
总结:
根glide 类似,但是是基于compose+kotlin实现的。
最核心的类是 RealImageLoader 。
Fetcher:获取资源的基类
RealImageLoader :调度图片资源获取 + 图片转成Bitmap(资源转换)
Mapper<HttpUrl, String>:请求头
Decoders:图片转换