#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-адреса.