Несколько резервных URL-адресов с идентификацией успешного URL-адреса

#android #kotlin #android-glide

Вопрос:

Я хотел бы иметь возможность определить более одного резервного 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 удался?

Ответ №1:

Мне удалось добиться желаемого эффекта, добавив a 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 устанавливается равным единице, если резервный запрос выполняется успешно, и в противном случае остается равным 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-адреса.