I've searched for a solution, but all I found are 100000 questions about how to use a placeholder which is not what I need.
I need Glide to try to load an image from another url if the first one failed.
This is what I've tried:
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)
It works on my test devices which are android 8 and 11.
But some of the users are getting a crash, including api 8 and 11.
This is the error:
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)
How to do this correctly?