2017-12-27 94 views
3

设置我有我的应用程序内的几个RecyclerView的,和所有的人都该有一个ImageView项目,这是与Glide进一步填充,这样不加载图片:泰尔滑翔如果偏好

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

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

我正在寻找这样的方法:

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

从我经历了滑翔,他们没有选择不加载,因为它没有意义。您可以使用您想要使用的首选项来创建经典的if语句:if(UserSettings.getInstance()。isImageLoadingEnabled()){} –

+0

对于此问题,唯一可靠的来源是https://bumptech.github.io/glide/。 –

回答

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) 


这是公平地说,你可以用shouldLoad()功能只创建一个Kotlin文件和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); 
3

假设你正在使用滑翔V4,有专门为此设计了一个请求选项:RequestOptions.onlyRetrieveFromCache(boolean flag)。启用时,只加载内存或磁盘缓存中已有的资源,有效防止来自网络的负载并节省带宽。

如果您使用Glide v4生成的API,则此选项可直接在GlideApp.with(context).asBitmap()返回的GlideRequest上使用。 否则,您必须创建一个RequestOptions使用此标志启用,apply它:

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

如果用户想要启用获取远程图像,该怎么办?他仍然必须作出if条件 –

+1

您可以在我的示例中将'!UserSettings.getInstance()。isImageLoadingEnabled()'传递给'onlyRetrieveFromCache'而不是'true'。这样,用户可以启用/禁用首选项屏幕中的远程图像获取。 –

+0

我偶然发现了这个,但用户界面不会很好。想象一下'RecyclerView',它具有随机加载图像的项目。除此之外,用户会抱怨图像仍在加载,尽管从缓存中加载。 – azurh