Coli的源码

Coli的使用

引入依赖

implementation("io.coil-kt:coil:2.4.0")

基本使用

// 图片资源 model --- Any 可以时 网络资源 图片url 和  本地资源drawable等  
AsyncImage(model = "图片地址url" , contentDescription ="无障碍图片描述" )

AsyncImage

点击方法

android paint 设置行高_缓存

requestOf

我们可以点进model相关的 requestOf(model) 看他是如何处理

android paint 设置行高_android paint 设置行高_02


如果是ImageRequest 直接返回model。 防止多次重复加载

不是ImageRequest。返回new ImageRequest一个对象。

我们点进ImageRequest.Builder(LocalContext.current)中的 Builder()方法,这里是初始化一系列请求参数,返回参数,图片相关的(大小,modify相关等)以便于后面 网络操作还是本地资源获取图片设置的初始化参数

android paint 设置行高_获取图片_03


所以这里将 图片信息放到ImageRequest 对象中。

updateRequest

android paint 设置行高_初始化_04


将图片大小和ImageRequest的信息 保存到 ImageRequest中

rememberAsyncImagePainter

点进 rememberAsyncImagePainter方法

android paint 设置行高_获取图片_05


requestOf是我们刚刚看过的方法 将model 数据 传入

android paint 设置行高_初始化_06


当没有build的 时候 。ImageRequest 刚创建的对象。 抛出异常

AsyncImagePainter

用于图片获取 等一系列的动作的对象

onRemembered()

android paint 设置行高_初始化_07


这里我们看到 异步获取操作。scope.launch{} 这里是通过ImageLoader去加载 图片的

ImageLoader

点进execute 方法

execute

android paint 设置行高_获取图片_08


将执行结果同步到主线程

点进 executeMain

executeMain

前部分是 获取请求,创建回调,设置图片转成Bitmap等一系列参数

android paint 设置行高_android_09

这一部分是具体

android paint 设置行高_android_10


result 为具体的操作。

RealInterceptorChain中的 interceptors 点进去

android paint 设置行高_缓存_11


我们能看到创建了 components对象

这个对象 有一系列的 获取图片资源框架
mapper:请求头
key : 是文件还是
fetcher : 获取数据
decoders :生成图片

网络获取图片 —三级缓存

HttpUriFetcher获取图片

点进去看fetch()看获取逻辑

android paint 设置行高_android_12


分析出来有资源

第一个 if 语句 第一次从在内存缓存中有 图片信息 metadata 返回

第二个 if 语句 第二次从内存卡Sdcard 中获取

下面esle 是从 第三次没有从网络缓存中获取 图片

下面 else 创建新的网络请求

android paint 设置行高_缓存_13


网络请求后的操作。

点进executeMain 中的 result 的 队列request 的 proceed()

android paint 设置行高_初始化_14


点进 interceptors的intercept方法

android paint 设置行高_android_15


缓存相关的 1,2,3级缓存具体操作

我们找到网络相关的

val result = execute(request, mappedData, options, eventListener)

点进去execute

android paint 设置行高_初始化_16


找到fetch()对应着图片各种获取的资源的方法

总结:
根glide 类似,但是是基于compose+kotlin实现的。
最核心的类是 RealImageLoader 。

Fetcher:获取资源的基类
RealImageLoader :调度图片资源获取 + 图片转成Bitmap(资源转换)
Mapper<HttpUrl, String>:请求头
Decoders:图片转换