相关文章推荐
叛逆的沙发  ·  if if 和if else - CSDN文库·  1 年前    · 
沉稳的筷子  ·  ASP.NET Web API ...·  2 年前    · 
活泼的太阳  ·  Pull Requests - Get ...·  2 年前    · 

Android Kotlin - Glide onLoadFailed 在出错时尝试另一个图片网址

1 人关注

我一直在寻找解决方案,但我找到的都是关于如何使用占位符的100000个问题,这并不是我需要的。

我需要Glide尝试从另一个URL加载图片,如果第一个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)

它在我的测试设备上工作,这些设备是安卓8和11。

但有些用户得到了崩溃,包括api8和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?

android
kotlin
android-glide
user17027702
发布于 2021-12-20
1 个回答
Jaber Bin Ahamed
Jaber Bin Ahamed
发布于 2021-12-20
已采纳
0 人赞同

你可以在没有处理程序的情况下做到这一点。