Coil - 基于Kotlin协程的Android图片加载库 - 1

268 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简介

Coil是基于Kotlin协程实现的Android图片加载库. 它具有如下特点:

  • : Coil执行了大量的优化, 包括内存和硬盘缓存, 内存图片采样, 请求自动暂停/取消, 等等.
  • : Coil仅向APK中添加了大约2000方法(对于已经使用了OkHttp和Coroutine的应用而言), 这和Picasso相当, 且比Glide和Fresco显著减少.
  • 好用: Coil的API充分利用了Kotlin的语言特性, 简单且少模版代码.
  • 现代: Coil是Kotlin第一, 且使用了诸如Coroutine, OkHttp, Okio, 和AndroidX Lifecycle等现代库.

Coil是首字母缩写: Coroutine Image Loader, 意思是协程图片加载器, 由instacart爱心制造.

下载

Coil通过mavenCentral()访问.

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

快速入门

ImageViews

要向ImageView中加载图片, 可以使用load扩展函数:

// URL
imageView.load("https://www.example.com/image.jpg")

// File
imageView.load(File("/path/to/image.jpg"))

// And more...

Request可能通过可选的尾置lambda来配置:

imageView.load("https://www.example.com/image.jpg") {
    crossfade(true)
    placeholder(R.drawable.image)
    transformations(CircleCropTransformation())
}

Jetpack Compose

导入Jetpack Compose扩展库:

implementation("io.coil-kt:coil-compose:2.1.0")

要想加载图片, 使用AsyncImage可组合函数:

AsyncImage(
    model = "https://example.com/image.jpg",
    contentDescription = null
)

Image Loaders

imageView.loadAsyncImage都使用了单例ImageLoader来执行图片请求. 单例ImageLoader可以通过使用Context扩展函数来访问:

val imageLoader = context.imageLoader

ImageLoader设计成可共享的, 且在应用中创建单例共享时是最高效的. 即便如此, 你依然可能创建自己的ImageLoader实例:

val imageLoader = ImageLoader(context)

如果你不想要单例ImageLoader, 要依赖io.coil-kt:coil-base而不是io.coil-kt:coil.

Requests

要想向自定义目标加载图片,  将ImageRequest入队enqueue:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .target { drawable ->
        // Handle the result.
    }
    .build()
val disposable = imageLoader.enqueue(request)

要想命令式地加载图片,  将ImageRequest执行execute:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .build()
val drawable = imageLoader.execute(request).drawable

Requirements

R8 / Proguard

Coil完全兼容R8, 并不需要添加任何规则.

如果你使用Proguard, 你需要为CoroutinesOkHttpOkio添加规则.