泰尔滑翔如果偏好
设置我有我的应用程序内的几个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());
如果你决定使用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);
假设你正在使用滑翔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);
如果用户想要启用获取远程图像,该怎么办?他仍然必须作出if条件 –
您可以在我的示例中将'!UserSettings.getInstance()。isImageLoadingEnabled()'传递给'onlyRetrieveFromCache'而不是'true'。这样,用户可以启用/禁用首选项屏幕中的远程图像获取。 –
我偶然发现了这个,但用户界面不会很好。想象一下'RecyclerView',它具有随机加载图像的项目。除此之外,用户会抱怨图像仍在加载,尽管从缓存中加载。 – azurh
从我经历了滑翔,他们没有选择不加载,因为它没有意义。您可以使用您想要使用的首选项来创建经典的if语句:if(UserSettings.getInstance()。isImageLoadingEnabled()){} –
对于此问题,唯一可靠的来源是https://bumptech.github.io/glide/。 –