【奇技淫巧】新的图片加载库?基于Kotlin协程的图片加载库——Coil(1)

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 类型

如果要加载到自定义 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, and https schemes 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

使用要求


我是 Flywith24,我的博客内容已经分类整理 在这里,点击右上角的 Watch 可以及时获取我的文章更新哦 😉

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
图片转存中…(img-VA0Kkvdo-1714978114975)]

【延伸Android必备知识点】

[外链图片转存中…(img-k3sJnnaP-1714978114976)]

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值