如何将 glide 与自定义下载器一起使用

How to use glide with custom downloader

我想使用 Glide 从我的 Nextcloud 服务器下载图片并将其加载到 ImageView 中。 Nextcloud 正在提供自己的库,用于连接 nextcloud 服务器和下载数据。 标准调用:

Glide.with(mContext)
   .load(new File(path))
   .into(holder.mImagePreview);

无法正常工作,因为文件 url 在 nextcloud 服务器的身份验证之后。

如何将我自己的下载逻辑传递给 Glide,以便我可以使用 nextcloud 库从我的 nextcloud 服务器下载图片?

您需要为 Glide 编写自定义模型加载器。 this ducment 描述如何编写自定义模型加载器。


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)
    }
}

并且当您使用 Glide

加载 File
Glide.with(mContext)
   .load(new File(path))
   .into(holder.mImagePreview);

Glide 调用您的模型加载器