我想使用Glide从Nextcloud服务器下载图片并将其加载到ImageView中。Nextcloud提供了一个自己的库,用于与nextcloud服务器连接并下载数据。标准通话:
Glide.with(mContext)
.load(new File(path))
.into(holder.mImagePreview);
无法使用,因为文件网址位于nextcloud服务器的身份验证后面。
如何将自己的下载逻辑传递给Glide,以便可以使用nextcloud库从nextcloud服务器下载图片?
您需要为Glide编写定制的Model Loader。本节介绍如何编写自定义模型加载器。
class FileDataFetcher(
private val model: File
) : DataFetcher<ByteBuffer> {
override fun getDataClass(): Class<ByteBuffer> = ByteBuffer::class.java
override fun cleanup() {
TODO("cleanup data fetcher | run on background thread")
}
override fun getDataSource(): DataSource {
TODO("return DataSource.LOCAL or DataSource.LOCAL OR DataSource.MEMORY_CACHE or DataSource.REMOTE based on your need")
}
override fun cancel() {
TODO("cancel download request | run on main thread")
}
override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in ByteBuffer>) {
TODO("start download or load in external storage | run on background thread")
}
}
class FileModelLoader : ModelLoader<File, ByteBuffer> {
override fun buildLoadData(model: File, width: Int, height: Int, options: Options): ModelLoader.LoadData<ByteBuffer>? =
ModelLoader.LoadData(ObjectKey(model), FileDataFetcher(model))
override fun handles(model: File): Boolean = model.exists()
}
class FileModelLoaderFactory : ModelLoaderFactory<File, ByteBuffer> {
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<File, ByteBuffer> = FileModelLoader()
override fun teardown() = Unit
}
@GlideModule
class GlideAppModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(File::class.java, ByteBuffer::class.java, FileModelLoaderFactory())
super.registerComponents(context, glide, registry)
}
}
当您File
使用Glide加载时
Glide.with(mContext)
.load(new File(path))
.into(holder.mImagePreview);
Glide称您的模型加载器
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句