android - 带有成功 URL 标识的多个后备 URL
问题描述
我希望能够定义多个后备 URL,同时还能够识别最终成功的 URL。据我了解,没有识别成功 URL 的附加要求,这很简单,可以通过多次调用error()
.
通过调整此处显示的示例,我假设可以完成以下操作:
Glide.with(fragment)
.load(url)
.error(Glide.with(fragment)
.load(fallbackUrl1))
.error(Glide.with(fragment)
.load(fallbackUrl2))
.error(Glide.with(fragment)
.load(fallbackUrl3))
.into(imageView);
但是,正如我所提到的,如果我需要在我的程序中按照哪个 URL 成功执行后续操作怎么办?
解决方案
我设法通过添加一个RequestListener
. 可以在此处找到一般用法示例。
但首先,我想澄清一下,声明多个回退不是通过链接调用来实现的error()
,而是通过嵌套它们来实现的。因此,而不是我在问题中显示的内容是:
Glide.with(fragment)
.load(url)
.error(Glide.with(fragment)
.load(fallbackUrl1)
.error(Glide.with(fragment)
.load(fallbackUrl2)
.error(Glide.with(fragment)
.load(fallbackUrl3)
)
)
)
.into(imageView);
不是我最喜欢的范式,但你有它。如前所述,除此之外,RequestListener
还使用了 s ,如果所述请求成功,它会设置一个变量来指示它们所代表的请求(以及通过关系,后备 URL)。
为了清楚起见,使用一个只有一个后备 URL 的示例,它看起来像这样:
var successfulURLIndex = 0
Glide.with(fragment)
.load(url)
.error(
Glide.with(fragment)
.load(fallbackURL1)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
Log.i("MainActivity", "fallback 1 fail")
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
successfulURLIndex = 1
Log.i("MainActivity", "fallback 1 success")
return false
}
})
.into(imageView)
onResourceReady
并onLoadFailed
分别在相关请求成功或失败时调用。因此,successfulURLIndex
如果回退请求成功,则设置为 1,否则保持为 0。然后使用此变量来识别哪个 URL 是成功的。
由于嵌套更多的后备侦听器显然会很快变得庞大,因此可以将匿名类对象(即object : RequestListener<Drawable> { ...
)提取到其自己的类中,从而使代码更加简洁,即使error()
嵌套了更多调用,如下所示:
Glide.with(fragment)
.load(url)
.error(
Glide.with(fragment)
.load(fallbackURL1)
.listener(ImageLoadListener(1))
.error(
Glide.with(fragment)
.load(fallbackURL2)
.listener(ImageLoadListener(2))
)
)
.into(imageView)
实例化时传递的值ImageLoadListener
是备用 URL 的索引。该索引被分配给一个单例变量,onResourceReady
并且与之前类似,用于标识成功的 URL。
推荐阅读
- ruby-on-rails - 使用 Trix 在文本中嵌入变量
- html - 删除移动设备上形状分隔符中出现的线条
- sitefinity - sitefinity form populate dropdownlist from API
- flutter - 如何在 ListView 中滚动
- java - Java Swing 如何在 JTextFields 上定义多个焦点侦听器但具有不同的按钮操作
- mysql - 驱动程序发生异常:SQLSTATE[HY000] [2002] Operation Now In Progress
- amazon-web-services - Quorum 节点使用 docker-compose 运行良好,但在 kubernetes 上部署时崩溃
- javascript - Javascript用数组中的日期和0计数填充缺失的日期
- delphi - 使用 Delphi 将单词范围替换为内容控件
- google-bigquery - 在 Bigquery 中给出两个值(“then”和“else”中的一个)的 case 语句。怎么了?