Android,Glide 4.3.0:如果必须这样做,请考虑使用 Handler 将 into() 或 clear()



Android Studio 3.2, Glide 4.3.0

我需要自定义处理图像未加载的情况(例如,当 url 不正确或服务器没有响应时(。

这是我的代码片段:

public static void loadImage(ImageView view, String imageUrl, GlideRoundedCornersTransformation.CornerType cornerType) {
RequestOptions requestOptionsTransform = RequestOptions.bitmapTransform(
new GlideRoundedCornersTransformation(view.getContext(), (int) AndroidUtil.dpToPx(view.getContext(),
view.getContext().getResources().getInteger(R.integer.image_rounded_corner_radius_dp)),
0, cornerType));
Glide.with(view.getContext())
.load(imageUrl)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
Glide.with(view.getContext()).load(R.drawable.default_image)
.apply(requestOptionsTransform)
.into(view));
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
view.setImageDrawable(resource);
return true;
}
})
.apply(requestOptionsTransform)
.into(view);
}

但是我收到此错误:

FATAL EXCEPTION: main
Process: com.myproject.android.customer.debug, PID: 25205
java.lang.IllegalStateException: You can't start or clear loads in RequestListener or Target callbacks. If you must do so, consider posting your into() or clear() calls to the main thread using a Handler instead.
at com.bumptech.glide.request.SingleRequest.assertNotCallingCallbacks(SingleRequest.java:279)
at com.bumptech.glide.request.SingleRequest.clear(SingleRequest.java:296)
at com.bumptech.glide.manager.RequestTracker.clearRemoveAndRecycle(RequestTracker.java:62)
at com.bumptech.glide.RequestManager.untrack(RequestManager.java:443)
at com.bumptech.glide.RequestManager.untrackOrDelegate(RequestManager.java:430)
at com.bumptech.glide.RequestManager.clear(RequestManager.java:418)
at com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:380)
at com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:432)
at com.myproject.android.customer.util.CommonUtil$1.onLoadFailed(CommonUtil.java:69)
at com.bumptech.glide.request.SingleRequest.onLoadFailed(SingleRequest.java:592)
at com.bumptech.glide.request.SingleRequest.onLoadFailed(SingleRequest.java:572)
at com.bumptech.glide.load.engine.EngineJob.handleExceptionOnMainThread(EngineJob.java:259)
at com.bumptech.glide.load.engine.EngineJob$MainThreadCallback.handleMessage(EngineJob.java:291)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7377)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)

我找到了解决方案。 使用滑行4.3

这里的代码:

public static void loadImage(ImageView view, String imageUrl, GlideRoundedCornersTransformation.CornerType cornerType) {
RequestOptions requestOptionsTransform = RequestOptions.bitmapTransform(
new GlideRoundedCornersTransformation(view.getContext(), (int) AndroidUtil.dpToPx(view.getContext(),
view.getContext().getResources().getInteger(R.integer.image_rounded_corner_radius_dp)),
0, cornerType));
Glide.with(view.getContext())
.load(imageUrl)
.error(Glide.with(view.getContext())
.load(R.drawable.default_image))
.apply(requestOptionsTransform)
.into(view);
}

我从这个 https://bumptech.github.io/glide/doc/debugging.html#you-cant-start-or-clear-loads-in-requestlistener-or-target-callbacks 得到帮助

您可以使用 Handler.post 或 targetView.post(可运行(

......
.listener(new RequestListener < Drawable >() {
@Override
public boolean onLoadFailed(
@Nullable GlideException e,
Object model,
Target<Drawable> target,
boolean isFirstResource
) {
view.post(new Runnable () {
@Override
public void run() {
Glide.with(view.getContext()).load(R.drawable.default_image)
.apply(requestOptionsTransform)
.into(view));
}
})

return false;
}
.......

按照异常消息中的建议,将 Runnable 发布到启动请求的主线程:

Handler handler = new Handler();
...
@Override
public boolean onLoadFailed(@android.support.annotation.Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
handler.post(new Runnable() {
@Override
public void run() {
Glide.with(...)
}
}
};

除了处理程序,您还可以使用

view.post(new Runnable() {
....
})

您可以使用applyDefaultRequestOptions实现相同的操作,并在发生任何错误时将RequestOptions.errorOf与默认图像一起传递。在您的情况下,您可以执行以下操作:

public static void loadImage2(ImageView view, String imageUrl) {
Glide.with(view.getContext())
.applyDefaultRequestOptions(RequestOptions.errorOf(R.drawable.default_image))
.load(imageUrl)
.into(view);
}

有关Requestoptions的更多信息,请点击此链接:

http://bumptech.github.io/glide/doc/options.html

最新更新