}
}
Gradle Kotlin DSL (.gradle.kts
)
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
tasks.withType {
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
, andhttps
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,
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!