将 Glide 用于 Android,使用(本地)替代资源作为 url 的好方法是什么?

Using Glide for Android, what's a good way to use (local) alternative sources for urls?

我正在使用 Glide 在我的 Android 应用程序中加载图像:

Glide.with(上下文) .load("http://www.example.com/whatever/icon.png") .into(imageView);

我想在我的应用程序 APK 文件中捆绑一些图片,以确保即使设备处于离线状态,它们也始终可用。我仍然想使用 Glide 来受益于调整大小的图像的内存缓存、在后台线程中加载和缩放等功能,并保持显示图像的界面一致。

我需要像这样加载的每个图像都由 URL 指定。 如果有本地版本(本地文件名是通过使用 URL 的一部分生成的 [例如,将 URL 字符串中的“http://www.example.com/”替换为 "file:///android_asset/bundled_images/whatever/"],我想用那个。如果没有,需要从实际下载图片URL.

这是一个例子:

我在 http://www.example.com/whatever/icon.png 有一张图片 我会将这张图片捆绑在 apk 中:

/assets/bundled_images/whatever/icon.png

规则如下:

如果图像文件存在于本地资产下,则使用该文件。如果图片在本地资源下不存在,则使用远程文件。

每当我请求将图像加载到图像视图中时,我希望能够只使用完整的 URL (http://www.example.com/whatever/icon.png),并且我的图像加载器应该能够自动首先检查本地副本。

我可以用 Glide 的任何功能做这样的事情吗?是的,我当然可以在调用 glide 之前检查文件是否存在,但这似乎是一个足够常见的用例,Glide could/should 有一个功能。在后台进行文件存在检查也很好。

Glide 提供了在设备离线时加载本地图像的选项。 这可以使用 error() 方法来完成。

Glide.with(this).load(imageUrl)
                .error(localImageResId)
                .into(mIconView);

上面的代码从 imageUrl 下载图像并将其加载到 imageView 中。 如果出现错误(例如设备离线),它会加载本地图像资源。

您可以按照此处描述的方式添加自定义 GlideModule 来实现所需的灵活性:Glide Configuration. Also you need to implement appropriate Glide's Loader which would encapsulate the logic for downloading. In your case it can be something similar to UriLoader