"You can’t start or clear loads in RequestListener or Target callbacks"
如果你嘗試在一個(gè) Target 或 RequestListener 里的 onResourceReady 或 onLoadFailed 中開始一次新的加載弯淘,Glide 將會(huì)拋出一個(gè)異常夫偶。之所以拋出這個(gè)異常,是因?yàn)橐幚砗突厥者@種在通知過程中的 (notifying) 加載對(duì)我們來說是一個(gè)巨大的挑戰(zhàn)辟躏。
好在這個(gè)問題很好解決仲吏。從 Glide 4.3.0 開始闪朱,你可以很輕松地使用 .error() 方法。這個(gè)方法接受一個(gè)任意的 RequestBuilder,它會(huì)且只會(huì)在主請(qǐng)求失敗時(shí)開始一個(gè)新的請(qǐng)求:
Glide.with(fragment)
.load(url)
.error(Glide.with(fragment)
.load(fallbackUrl))
.into(imageView);
對(duì)于 Glide 4.3.0 以前的版本啄踊,你也可以使用一個(gè) Android Handler 來 post 一個(gè) Runnable 給你的請(qǐng)求:
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);
完整的錯(cuò)誤堆棧信息
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)