美文网首页
Glide加载回调中发起新的加载

Glide加载回调中发起新的加载

作者: 钦_79f7 | 来源:发表于2019-12-18 11:31 被阅读0次

"You can’t start or clear loads in RequestListener or Target callbacks"

如果你尝试在一个 Target 或 RequestListener 里的 onResourceReady 或 onLoadFailed 中开始一次新的加载,Glide 将会抛出一个异常。之所以抛出这个异常,是因为要处理和回收这种在通知过程中的 (notifying) 加载对我们来说是一个巨大的挑战。

好在这个问题很好解决。从 Glide 4.3.0 开始,你可以很轻松地使用 .error() 方法。这个方法接受一个任意的 RequestBuilder,它会且只会在主请求失败时开始一个新的请求:

Glide.with(fragment)
  .load(url)
  .error(Glide.with(fragment)
     .load(fallbackUrl))
  .into(imageView);

对于 Glide 4.3.0 以前的版本,你也可以使用一个 Android Handler 来 post 一个 Runnable 给你的请求:

private final Handler handler = new Handler();
...

Glide.with(fragment)
  .load(url)
  .listener(new RequestListener<Drawable>() {
      ...

      @Override
      public boolean onLoadFailed(@Nullable GlideException e, Object model, 
          Target<Drawable> target, boolean isFirstResource) {
        handler.post(new Runnable() {
            @Override
            public void run() {
              Glide.with(fragment)
                .load(fallbackUrl)
                .into(imageView);
            }
        });
      }
  )
  .into(imageView);

完整的错误堆栈信息

java.lang.IllegalStateException: You can't start or clear loads in RequestListener or Target callbacks. If you're trying to start a fallback request when a load fails, use RequestBuilder#error(RequestBuilder). Otherwise consider posting your into() or clear() calls to the main thread using a Handler instead.
com.bumptech.glide.request.SingleRequest.l(TbsSdkJava)
com.bumptech.glide.request.SingleRequest.c(TbsSdkJava)
com.bumptech.glide.manager.RequestTracker.a(TbsSdkJava)
com.bumptech.glide.manager.RequestTracker.b(TbsSdkJava)
com.bumptech.glide.RequestManager.b(TbsSdkJava)
com.bumptech.glide.RequestManager.c(TbsSdkJava)
com.bumptech.glide.RequestManager.a(TbsSdkJava)
com.bumptech.glide.RequestBuilder.a(TbsSdkJava)
com.bumptech.glide.RequestBuilder.a(TbsSdkJava)
com.jiedai.loan.ui.activity.ADActivity.k(TbsSdkJava)
com.jiedai.loan.ui.activity.ADActivity$1.a(TbsSdkJava)
com.bumptech.glide.request.SingleRequest.a(TbsSdkJava)
com.bumptech.glide.request.SingleRequest.a(TbsSdkJava)
com.bumptech.glide.load.engine.EngineJob.f(TbsSdkJava)
com.bumptech.glide.load.engine.EngineJob$MainThreadCallback.handleMessage(TbsSdkJava)
android.os.Handler.dispatchMessage(Handler.java:98)
android.os.Looper.loop(Looper.java:135)
android.app.ActivityThread.main(ActivityThread.java:5418)
java.lang.reflect.Method.invoke(Native Method)
java.lang.reflect.Method.invoke(Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

相关文章

  • Glide加载回调中发起新的加载

    "You can’t start or clear loads in RequestListener or Tar...

  • Glide 加载图片保存至本地,加载回调监听

    Glide 加载图片使用到的两个记录 Glide 加载图片保存至本地指定路径 Glide 加载图片回调方法

  • Glide工作原理

    Glide加载发起流程: 1、Glide.with(context)创建RequestManager Reques...

  • Glide深入分析

    一、加载流程源码分析 glide加载图片的基本使用如下: Glide类中重载了多个with()方法,根据Glide...

  • 初探Glide,Google推介的图片缓存库

    0 .Thanks 项目地址 Android Glide图片加载(加载监听、加载动画)【Glide】重新加载图片 ...

  • Glide

    Glide常用: ////原生加载,图片过大,OOM异常 使用Glide加载 Glide 1.简介 Glide,一...

  • Js中的回调

    Js中的callback机制,即回调.JS中用到回调的几种情况:1.动态加载(外部)js的时候,在加载完成之后进行...

  • Glide的简单使用

    Glide加载不同位置的图片 加载git 图片 加载本地视频。(表示没试过) Glide的缓存 图片加载优先级:递...

  • Glide

    Glide常用: //原生加载,图片过大,OOM异常 使用Glide加载 Glide 1.简介 Glide,一个被...

  • Android无享商城问题记录

    @钟建新 23、Glide 加载七牛视频缩略图问题 1.直接使用Glide 加载的效果,图片按照视频原来大小显示 ...

网友评论

      本文标题:Glide加载回调中发起新的加载

      本文链接:https://www.haomeiwen.com/subject/pfoynctx.html