新的图片加载库——Coil
Coil 是 Instacart 团队研发的新的的图片加载库,它使用了很多高级功能,例如协程,Okhttp,androidx.lifecycle。Coil 还包括一些高级功能,例如图像采样,有效的内存使用以及请求的自动取消/暂停
默认情况下 Coil 与 R8 完全兼容,开箱即用,不需要添加额外的规则。如果使用 Proguard ,您可能需要为 Coroutines, OkHttp 和 Okio 添加规则
Coil 的优势
- 快速:
Coil进行了很多优化,包括内存和磁盘缓存,对内存中的图像进行采样,重新使用位图,自动暂停/取消请求等等 - 轻量:
Coil在您的APK中添加了约 2000 种方法(对于已经使用OkHttp和Coroutines的应用程序),与Picasso相当,远少于Glide和Fresco - 易用:
Coil的 API 利用 Kotlin 的特性简化了样板代码 - 现代:
Coil是Kotlin-first,使用现代化的库,例如Coroutines,OkHttp,Okio, 以及AndroidX Lifecycles
Coil 是以下名称的缩写:Coroutine Image Loader
Artifacts
Coil 拥有 5 个 artifact 并发布在 mavenCentral()
io.coil-kt:coil:依赖于io.coil-kt:coil-base并且包含了Coil的单例和ImageView.load的扩展函数io.coil-kt:coil-base:base 库,不包含Coil的单例和ImageView.load的扩展函数,如果使用依赖注入,则可以使用该库io.coil-kt:coil-gif:引入一系列解码器以支持解码 gifio.coil-kt:coil-svg:引入一系列解码器以支持 svgio.coil-kt:coil-video:包括两个 fetchers ,以支持从 Android 支持的任何视频格式中提取和解码帧
// 普通使用引用
implementation "io.coil-kt:coil:0.11.0"
// 使用依赖注入时或者制作基于 coil 的库引用
implementation "io.coil-kt:coil-base:0.11.0"
Java 8
Coil 要求 Java 8,要通过 D8 启用 Java 8 调试,请将以下内容添加到 Gradle 脚本
Gradle (.gradle)
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions {
jvmTarget = "1.8"
}
}
Gradle Kotlin DSL (.gradle.kts)
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "1.8"
}
}
使用
ImageView 扩展函数
io.coil-kt:coil 提供了 类型安全的 ImageView 扩展函数
在 ImageView 中加载图片,只需调用 load 扩展函数
// URL
imageView.load("https://www.example.com/image.jpg")
// Resource
imageView.load(R.drawable.image)
// File
imageView.load(File("/path/to/image.jpg"))
// And more...
上面的请求等价于:
val imageLoader = Coil.imageLoader(context)
val request = LoadRequest.Builder(imageView.context)
.data("https://www.example.com/image.jpg")
.target(imageView)
.build()
imageLoader.execute(request)
可选的请求配置可以通过 lambda 来操作
imageView.load("https://www.example.com/image.jpg") {
crossfade(true)
placeholder(R.drawable.image)
transformations(CircleCropTransformation())
}
Image Loaders¶
ImageLoader 是执行请求的服务类。 他们处理缓存,数据获取,图像解码,请求管理,bitmap pool,内存管理等。 可以使用 builder 来创建和配置新实例:
val imageLoader = ImageLoader.Builder(context)
.availableMemoryPercentage(0.25)
.crossfade(true)
.build()
imageView.load 使用单例 ImageLoader 执行 LoadRequest 。 可以使用以下方式访问单例 ImageLoader:
val imageLoader = Coil.imageLoader(context)
(可选)您可以创建自己的ImageLoader实例,并通过依赖项注入将它们注入:
val imageLoader = ImageLoader(context)
当您创建单个 ImageLoader 并在整个应用程序中共享时,Coil 的性能最佳。 这是因为每个 ImageLoader 都有自己的内存缓存,bitmap pool 和网络监听
Requests¶
有两种 Request 类型
LoadRequest是一个生命周期范围的 request,支持Target,Transition等等GetRequest挂起并返回RequestResult
如果要加载到自定义 target 中,可以执行 LoadRequest
val request = LoadRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.target { drawable ->
// Handle the result.
}
.build()
imageLoader.execute(request)
要强制获取图像,请执行GetRequest:
val request = GetRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.build()
val drawable = imageLoader.execute(request).drawable
单例
如果您使用的是 io.coil-kt:coil ,您可以使用以下任意方式设置 ImageLoader 的实例
在 Application 中实现 ImageLoaderFactory(推荐)
class MyApplication : Application(), ImageLoaderFactory {
override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(context)
.crossfade(true)
.okHttpClient {
OkHttpClient.Builder()
.cache(CoilUtils.createDefaultCache(context))
.build()
}
.build()
}
}
调用 Coil.setImageLoader
val imageLoader = ImageLoader.Builder(context)
.crossfade(true)
.okHttpClient {
OkHttpClient.Builder()
.cache(CoilUtils.createDefaultCache(context))
.build()
}
.build()
Coil.setImageLoader(imageLoader)
默认的 ImageLoader 可以通过这样取回
val imageLoader = Coil.imageLoader(context)
设置默认的 ImageLoader 是可选的。 如果未设置,则 Coil 会延迟创建具有默认值的 ImageLoader
如果您使用的是 io.coil-kt:coil-base,您应创建自己的 ImageLoader 实例并通过依赖注入将它注入到 app 中
注意:如果设置自定义OkHttpClient,则必须设置缓存实现,否则ImageLoader将没有磁盘缓存。 可以使用CoilUtils.createDefaultCache 创建默认的 Coil 缓存实例
支持的数据类型
ImageLoader 支持的数据类型为
- String (mapped to a Uri)
- HttpUrl
- Uri (
android.resource,content,file,http, andhttpsschemes only) - File
- @DrawableRes Int
- Drawable
- Bitmap
预加载
如果要预加载到内存中,执行一个不带 target 的 LoadRequest
val request = LoadRequest.Builder(context)
.data("https://www.example.com/image.jpg")
// 可选的,但是设置 ViewSizeResolver 可以通过限制预加载的大小来节省内存
.size(ViewSizeResolver(imageView))
.build()
imageLoader.execute(request)
如果只想将网络图片预加载到磁盘中,可以为 request 关闭内存缓存
val request = LoadRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.memoryCachePolicy(CachePolicy.DISABLED)
.build()
imageLoader.execute(request)
取消请求
LoadRequest 会自动取消在以下几种情况下
-
关联的 view detached,
-
关联的 lifecycle destroyed
-
另一个 request 在相同的 view 中开启
此外,每个 LoadRequest 返回一个 RequestDisposable,可用于检查请求是否在运行中或处理该请求(有效地取消请求并释放其关联资源)
val disposable = imageView.load("https://www.example.com/image.jpg")
// Cancel the request.
disposable.dispose()
GetRequest 仅当协程的上下文被取消时才会取消
图片采样
假设磁盘上有一个 500x500 的映像,但是只需要以 100x100 的大小将其加载到内存中即可在视图中显示。 Coil 会将图像加载到内存中,但是如果您需要 500x500 的图像会怎样呢? 从磁盘读取还有更好的「质量」,但是图像已经以 100x100 加载到内存中。 理想情况下,当我们从磁盘以 500x500 读取图像时,我们将使用 100x100 图像作为占位符。
这正是 Coil 所做的,并且 Coil 自动为所有 BitmapDrawables 处理此过程。 与 crossfade(true) 搭配使用时,可以创建视觉效果,使图像细节看起来像淡入淡出,类似于渐进式 JPEG

使用要求
- AndroidX
- Min SDK 14+
- Compile SDK: 29+
- Java 8+
详细内容移步 官方文档
关于我
我是 Flywith24,我的博客内容已经分类整理 在这里,点击右上角的 Watch 可以及时获取我的文章更新哦 😉
最后
按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。
整个笔记一共8大模块、729个知识点,3382页,66万字,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。


因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。
如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。
(一)架构师必备Java基础
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……

(二)设计思想解读开源框架
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
……

(三)360°全方位性能优化
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
……

(四)Android框架体系架构
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
……

(五)NDK模块开发
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
……

(六)Flutter学习进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
……

(七)微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
……

(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……

好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码领取哈~


Coil是一款由Instacart开发的轻量级图片加载库,利用Kotlin协程提高性能。它支持内存和磁盘缓存、自动暂停/取消请求、图像采样等功能。Coil具有简洁的API,与Android兼容性良好,并提供多种扩展功能,如GIF和SVG解码。使用ImageView扩展函数简化加载操作,ImageLoader负责请求管理。预加载、取消请求和单例模式进一步提高了库的灵活性和效率。
3729

被折叠的 条评论
为什么被折叠?



