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

Posted

技术标签:

【中文标题】Android Kotlin - Glide onLoadFailed 在错误时尝试另一个图像 url【英文标题】:Android Kotlin - Glide onLoadFailed try another image url on error 【发布时间】:2022-01-22 02:17:32 【问题描述】:

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

如果第一个失败,我需要 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)

如何正确地做到这一点?

【问题讨论】:

【参考方案1】:

你可以在没有 Handler 的情况下做到这一点。

只使用这个tryAlternative() 而不是

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

【讨论】:

我知道但你认为处理程序是导致崩溃的原因? 我想。可能是 我增加到 5000 以查看是否有任何崩溃但没有,所以我认为这不是问题 如果没有处理程序,您可以使用协程,如果 url 有效,您可以检查您的有效图像 url,然后您通过 url 进行滑行 它们是有效的,唯一的问题是服务器过载时出现500错误。在实际加载之前检查图像是否可以加载会给服务器带来额外的工作量,所以它不是一个选项

以上是关于Android Kotlin - Glide onLoadFailed 在错误时尝试另一个图像 url的主要内容,如果未能解决你的问题,请参考以下文章

Android探索之旅(第三十五篇)Kotlin知识整集

Android探索之旅(第三十五篇)Kotlin知识整集

从 Java 转向 Kotlin,使用 Glide,但是 GlideApp 却无法生成

Android Kotlin - 加载 ImageView 内的图像

0.Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

0.Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM