代码之家  ›  专栏  ›  技术社区  ›  azurh

告诉Glide如果在preferences中设置,则不要加载图像

  •  3
  • azurh  · 技术社区  · 6 年前

    我有几个 RecyclerView 在我的应用程序中,所有的项目都有 ImageView ,进一步填充 Glide ,如下所示:

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

    在我的首选项屏幕中,用户可以禁用加载所有远程图像以节省带宽。 最好的方式是什么 滑行 不加载图像,不使用所有内部的经典if-else条件 回收视图 适配器,这违反了干燥原则?

    我正在寻找这样一种方法:

    .shouldLoad(UserSettings.getInstance().isImageLoadingEnabled());
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   Thibault Seisel    6 年前

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

    如果使用Glide v4生成的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);
    
        2
  •  2
  •   Alexey Denysenko    6 年前

    如果您决定使用 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)
    


    公平地说,你只能创建一个 科特林 使用文件 shouldLoad() 函数并在中使用 Java ,但代码变得丑陋:

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

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