首页 > 解决方案 > 带有成功 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 成功执行后续操作怎么办?

标签: androidkotlinandroid-glide

解决方案


我设法通过添加一个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)

onResourceReadyonLoadFailed分别在相关请求成功或失败时调用。因此,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。


推荐阅读