Fetcher 用于从 uri 获取数据,返回 FetchResult,交由 BitmapDecoder 或 DrawableDecoder 使用。
Sketch 对支持的每一种 uri 都有对应的 Fetcher 实现,共有如下几种:
- AssetUriFetcher:从 app 的 assets 目录加载图片
- Base64UriFetcher:从 uri 本身加载 base 64 格式的图片
- ContentUriFetcher:从 ContentResolver 加载图片
- FileUriFetcher:从本地文件加载图片
- HttpUriFetcher:从 http uri 加载图片
- ResourceUriFetcher:从 Android Resource 中加载图片
- AppIconUriFetcher:从已安装 app 加载其图标,点我了解如何使用
首先需要实现 Fetcher 接口定义你的 Fetcher 和它的 Factory,如下:
class MyFetcher : Fetcher {
override suspend fun fetch(): Result<FetchResult> {
// 在这里解析你的 uri,获取数据
}
companion object {
const val MY_SCHEME = "myUri"
}
class Factory : Fetcher.Factory {
override fun create(sketch: Sketch, request: ImageRequest): MyFetcher? {
return if (request.uriString.startWith(MY_SCHEME)) {
MyFetcher()
} else {
null
}
}
}
}
如果要让所有的 ImageRequest 都使用就在配置 Sketch 时通过 components 方法注册,这样所有的 ImageRequest 都可以使用,如下:
class MyApplication : Application(), SketchFactory {
override fun createSketch(): Sketch {
return Sketch.Builder(this).apply {
components {
addFetcher(MyFetcher.Factory())
}
}.build()
}
}
或者在显示图片时只给当前 ImageRequest 注册,这样就只有当前 ImageRequest 可以使用,如下:
imageView.displayImage(context, "http://sample.com/sample.jpeg") {
components {
addFetcher(MyFetcher.Factory())
}
}