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

995 阅读1分钟

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

兼容Java

Coil的API是设计成Kotlin优先的. Coil充分利用了Kotlin的语言特性, 如内联lambda, 接收器参数, 默认参数, 以及扩展函数, 而这些在Java中是不可用的.

重要的是, Java不能实现挂起函数. 这意味着自定义TransformationSize ResolverFetcher, 和Decoders 必须在Kotlin中实现.

尽管有这些限制, 大多数的Coil API是兼容Java的. 扩展函数Context.imageLoader不能从Java中使用. 可是, 可以使用单例ImageLoader:

ImageLoader imageLoader = Coil.imageLoader(context)

ImageRequest入队的语法在Java和Kotlin中几乎一样:

ImageRequest request = new ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .crossfade(true)
    .target(imageView)
    .build();
imageLoader.enqueue(request)

注意

ImageView.load不能在Java中使用. 需使用ImageRequest.Builder API.

suspend函数不能在Java中轻易调用. 由此, 要想异步加载图片, 必须要使用ImageLoader.executeBlocking扩展函数, 它在Java中的调用类似于下面的例子:

ImageRequest request = new ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .size(1080, 1920)
    .build();
Drawable drawable = ImageLoaders.executeBlocking(imageLoader, request).getDrawable();

注意

ImageLoaders.executeBlocking将会阻塞而非挂起当前线程. 因而不要在主线程中调用这个函数.

Gif

不像Glide, Coil默认不支持GIF. 可是Coil有扩展库支持加载GIF.

要添加GIF支持, 导入扩展库:

implementation("io.coil-kt:coil-gif:2.2.0")

而且要在构建ImageLoader的时候将解码器添加进组件注册器:

val imageLoader = ImageLoader.Builder(context)
    .components {
        if (SDK_INT >= 28) {
            add(ImageDecoderDecoder.Factory())
        } else {
            add(GifDecoder.Factory())
        }
    }
    .build()

ImageLoader会使用文件头来自动侦测GIF并且正确地解码.

注意

Coil引入了2个独立的解码器以支持解码GIF. GifDecoder支持全部API版本, 但是慢. ImageDecoderDecoder基于ImageDecoder实现, 却只支持API 28及以上. ImageDecoderDecoder要比GifDecoder快而且支持解码动画WebP图片和动画HEIF图片序列.