如果在首选项中设置,请告知Glide不要加载图像

时间:2017-12-27 12:52:04

标签: android android-glide

我的应用程序中有几个RecyclerView,并且所有这些项目都有ImageView的项目,这些项目进一步填充了Glide,如下所示:< / p>

Glide.with(context)
 .load(imageUrl)
 .asBitmap()
 .error(R.drawable.placeholder_avatar)
 .centerCrop()
 .into(mAvatarImageView);

在我的首选项屏幕中,用户可以禁用所有远程图像的加载以节省带宽。 如果不使用违反DRY原则的所有Glide适配器中的经典if-else条件,告诉RecyclerView不加载图片的最佳方法是什么?

我正在寻找这样的方法:

.shouldLoad(UserSettings.getInstance().isImageLoadingEnabled());

2 个答案:

答案 0 :(得分:3)

假设您使用的是Glide v4,则会有专门为此目的设计的请求选项:RequestOptions.onlyRetrieveFromCache(boolean flag)。启用后,仅加载内存或磁盘缓存中已存在的资源,有效防止来自网络的负载并节省带宽。

如果您使用Glide v4 Generated API,则此选项可直接在GlideRequest返回的GlideApp.with(context).asBitmap()上使用。 否则,您必须创建RequestOptions并启用此标记并apply

RequestOptions options = new RequestOptions().onlyRetrieveFromCache(true);
Glide.with(context).asBitmap()
    .apply(options)
    .error(R.drawable.placeholder_avatar)
    .centerCrop()
    .into(mAvatarImageView);

答案 1 :(得分:2)

如果您决定使用Kotlin,则可以创建所需的扩展功能:

fun <T> RequestBuilder<T>.shouldLoad(neededToLoad : Boolean) : RequestBuilder<T> {
    if(!neededToLoad) {
        return this.load("") // If not needed to load - remove image source
    }
    return this // Continue without changes
}

然后你可以使用它,正如你所描述的那样:

Glide.with(context)
        .load(imageUrl)
        .shouldLoad(false)
        .into(imageView)


可以公平地说,您只能使用Kotlin函数创建一个shouldLoad()文件并在Java中使用它,但代码变得丑陋:

shouldLoad(Glide.with(this)
                .load(imageUrl), false)
            .into(imageView);

OR

RequestBuilder<Drawable> requestBuilder = Glide.with(this)
        .load(imageUrl);
requestBuilder = shouldLoad(requestBuilder, true);
requestBuilder.into(imageView);