Android Kotlin-Glide onLoadFailed尝试另一个错误的图像url



我已经搜索了一个解决方案,但我只找到了100000个关于如何使用占位符的问题,这不是我所需要的。

如果第一个url失败,我需要Glide尝试从另一个url加载图像。

这就是我尝试过的:

fun tryAlternative(){
val alternativeUrl = func.getMediaUrl(mediaServer) + mediaParameters
Glide
.with(context)
.load(alternativeUrl)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
holder.picLoadIcon.visibility = View.GONE
holder.image.requestLayout()
holder.picContainer.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
holder.picContainer.requestLayout()
return false
}
})
.apply(glideOptions)
.fitCenter()
// .transform(CutOffLogo())
.into(holder.image)
}
Glide
.with(context)
.load(fileUrl)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
Handler(Looper.getMainLooper()).postDelayed({
tryAlternative()
}, 500)
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
holder.picLoadIcon.visibility = View.GONE
holder.image.requestLayout()
holder.picContainer.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
holder.picContainer.requestLayout()
return false
}
})
.apply(glideOptions)
.fitCenter()
// .transform(CutOffLogo())
.into(holder.image)

它适用于我的测试设备,即android 8和11。

但一些用户正在崩溃,包括api 8和11。

这就是错误:

java.lang.IllegalArgumentException: 
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed (RequestManagerRetriever.java)
at com.bumptech.glide.manager.RequestManagerRetriever.get (RequestManagerRetriever.java)
at com.bumptech.glide.manager.RequestManagerRetriever.c (RequestManagerRetriever.java:18)
at com.bumptech.glide.Glide.with (Glide.java)
at de.bla.pname.adapters.MemesAdapter.onBindViewHolder$tryAlternative (MemesAdapter.java)
at de.bla.pname.adapters.MemesAdapter.access$onBindViewHolder$tryAlternative (MemesAdapter.java)
at de.bla.pname.adapters.MemesAdapter$onBindViewHolder$10.onLoadFailed$lambda-0 (MemesAdapter.java)
at de.bla.pname.adapters.MemesAdapter$onBindViewHolder$10$$InternalSyntheticLambda$1$c05fc0ac0dc127b19ad39a5f25d91eeedfcc97ef8006ab4a8bfc1edb23485f8f$0.run$bridge (MemesAdapter.java)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:246)
at android.app.ActivityThread.main (ActivityThread.java:8587)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)

如何正确执行此操作?

您可以在没有Handler的情况下完成此操作。

只使用这个tryAlternative()而不是

Handler(Looper.getMainLooper()).postDelayed({
tryAlternative()
}, 500)

最新更新