val request = ImageRequest.Builder(context)
.data(url)
.target(imageView)
.build()
return Coil.imageLoader(context).enqueue(request)
从Coil的使用上面可以知道,主要的类为ImageRequest和ImageLoader,通过ImageRequest设置图片路径,目标view等,为ImageLoader加载图片提供所有必要的信息。
主要流程
从ImageLoader的enqueue方法开始,进入到RealImageLoader,然后是一个责任链,最终执行到Engine拦截器,内部主要是获取ImageRequest设置的图片路径,然后通过mappers转化为特定的类型以提供给fetchers处理,主要流程如下图所示,其中mapper、fetcher、decode都可以通过ComponeRegisty设置自定义效果
缓存
缓存主要分为内存缓存和磁盘缓存。
内存缓存主要关键类为StrongMenoryCache、RealWeakMenoryCache,磁盘缓存主要利用OkHttp实现。RealWeakMenoryCache主要是存放了弱引用的Bitmap信息,StrongMenoryCache则还是利用LruCache来处理。在EngineIntercept中,会生成内存缓存需要的key,若没有手动设置过Key的话,则会通过computeMemoryCacheKey方法生成,然后利用key优先在LruCache中查找数据,未找到再去弱引用中查找。
MemoryCacheService.get
val value = strongMemoryCache.get(key) ?: weakMemoryCache.get(key)
若都未找到,则利用fetcher去获取图片数据,例如网络图片则使用HttpFetcher进行网络请求获取数据,其中会根据设定判断是从网络获取还是缓存获取。
HttpFetcher.fetche
//默认都为true
val networkRead = options.networkCachePolicy.readEnabled
val diskRead = options.diskCachePolicy.readEnabled
when {
!networkRead && diskRead -> {
request.cacheControl(CacheControl.FORCE_CACHE)
}
networkRead && !diskRead -> if (options.diskCachePolicy.writeEnabled) {
request.cacheControl(CacheControl.FORCE_NETWORK)
} else {
request.cacheControl(CACHE_CONTROL_FORCE_NETWORK_NO_CACHE)
}
!networkRead && !diskRead -> {
request.cacheControl(CACHE_CONTROL_NO_NETWORK_NO_CACHE)
}
}
然后进行decode、Transform操作,最后将数据存入到strongMemoryCache中去。
关联生命周期
关于生命周期,主要是利用Lifecycle,在RealImageLoader的executeMain方法内,通过createRequestDelegate将Request,target,job信息包装为ViewTargetRequestDelegate,delegate实现DefaultLifecycleObserver(其中默认创建的ImageViewTarget同样也实现DefaultLifecycleObserver接口),然后调用lifecycle.addObserver(delegate)注册生命周期观察者的监听,在onDestroy中处理分别处理job.cancel(),targetDelegate.clear()
Size
可以通过ImageRequest设置SizeResolver,若未设置则通过resolveSizeResolver方法创建,根据Target中的view来获取相对应的宽高
参考资料
本文使用 mdnice 排版