当前位置: 首页 > 知识库问答 >
问题:

Android,Glide 4.3.0:如果必须这样做,可以考虑使用处理程序将into()或clear()调用发送到主线程

慕乐池
2023-03-14
  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)

共有1个答案

壤驷敏学
2023-03-14

我找到解决办法了。使用滑翔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中获得帮助

 类似资料:
  • 这是一个扩展Thread并实现run()函数的类: 现在在主活动中的一个按钮中,我有这样的代码: 据我所知,这应该将runnable放在目标线程的消息队列中,并且线程(不是UI线程)将在可能的情况下运行它。但此代码会阻止 UI。为什么会发生这种情况?如您所见,我将目标线程的循环器发送到处理程序构造函数,并且处理程序应使用该循环器而不是主线程的循环程序。

  • 问题内容: 我正在尝试为应用程序创建登录名。但是我有一个问题。 这是我的代码: Android studio表示必须在istructions的UI线程中调用该方法:以及 可能的解决方案? 问题答案: 尝试将您的值传递给 via 方法:

  • 我有客户端代码运行在javascript试图发送html内容到自定义处理程序。 客户端代码如下所示: 处理程序代码为: 问题在于,使用Chrome浏览器时,处理程序获取的消息(txt_内容)不完整。我得到的字符串的最大长度是:524288 当我在资源管理器中运行时,我会得到完整的消息(长度=567130)。 我在这里看到了一个类似的问题,但没有得到回答(设置maxAllowedContentLen

  • 问题内容: 方法getText()必须从UI线程调用,请提供帮助。我是android studio的初学者,可以在网上找到这些代码,但无法弄清楚,我真的很感激。 问题答案: 在其UI线程而非后台线程中获取值。

  • 问题内容: 我有一种写入日志文件的方法。如果文件存在,则应将其追加到文件中,否则,我希望它创建一个新文件。 我要检查是否可以创建文件。文件是一个java.io.File对象。createNewFile引发IOException:没有此类文件或目录。自从我几周前编写此方法以来,该方法一直非常有效,直到最近才开始执行此方法,尽管我不知道自己可以更改什么。我检查了该目录是否存在,并且我拥有该目录的写权限

  • 问题内容: 我的JavaScript中有一个计时器,该计时器需要模拟时间流逝后单击链接以转到另一个页面。为此,我使用了jQuery的功能。我已经用过了,也可以使用,并且我可以使这三个都按预期工作。 我观察到一些奇怪的行为,并且试图了解发生了什么以及为什么。 我在这个问题中描述的所有内容都使用了Firefox,但是我也对其他浏览器将如何使用它感兴趣。 如果我没有使用过或未设置事件处理程序,则调用似乎