Я понял это после прочтения Учебник Glide's ModelLoaders . Ключ заключается в делегировании загрузки ModelLoader, который знает, как обрабатывать схемы file
и http/https
.
Что мне нужно было сделать, это реализовать интерфейс ModelLoader
напрямую вместо расширения BaseGlideUrlLoader
. Мы уже знаем, что встроенная в Glide UriLoader
может обрабатывать схемы file
и http/https
, поэтому мы делегируем ее. Теперь, чтобы получить экземпляр UriLoader
, мы используем MultiModelLoaderFactory
, который передается методу build
нашей фабрики. Конфигурация Glide по умолчанию регистрируется UriLoader
для Uri
+ InputStream
пары.
class CenterCropImageInformationLoader(
private val modelLoader: ModelLoader<Uri, InputStream>,
private val modelCache: ModelCache< CenterCropImageInformation, Uri>
) : ModelLoader<CenterCropImageInformation, InputStream> {
override fun buildLoadData(
model: CenterCropImageInformation,
width: Int,
height: Int,
options: Options
): ModelLoader.LoadData<InputStream>? {
val uri: Uri = modelCache.get(model, width, height) ?: model.getUri(model, width, height)
modelCache.put(model, width, height, uri)
return modelLoader.buildLoadData(uri, width, height, options)
}
override fun handles(model: CenterCropImageInformation): Boolean = true
class Factory(
private val applicationContext: Context,
private val modelCache: ModelCache<CenterCropImageInformation, Uri>
) : ModelLoaderFactory<CenterCropImageInformation, InputStream> {
override fun build(
multiFactory: MultiModelLoaderFactory
): ModelLoader<CenterCropImageInformation, InputStream> {
val modelLoader = multiFactory.build(Uri::class.java, InputStream::class.java)
return CenterCropImageInformationLoader(applicationContext, modelLoader, modelCache)
}
override fun teardown() {}
}
}
Как мы видим, мы больше не расширяем BaseGlideUrlLoader
. Вместо этого мы реализуем интерфейс ModelLoader
, а в реализации buildLoadData()
мы пытаемся получить URI из кэша (это похоже на то, что делает BaseGlideUrlLoader
), а затем мы вызываем buildLoadData()
в ModelLoader
, который мы передали конструктор, который является экземпляром UriLoader
, как я упоминал ранее, благодаря MultiModelLoaderFactory
.
Удивительно, что этот тип ModelLoader не входит в состав встроенных загрузчиков моделей Glide.