【问题标题】:Android: Getting CalledFromWrongThreadException even though the Runnable is posted to the viewAndroid:即使 Runnable 已发布到视图,也会出现 CalledFromWrongThreadException
【发布时间】:2015-11-25 11:09:29
【问题描述】:

我遇到了一个奇怪的问题。我的代码有一个广播接收器,它在其 onReceive() 中执行此操作:

view.post(new Runnable() {
    @Override
    public void run() {
    view.refreshUI();
}});

我对这段代码显示android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.的原因感到困惑

我已经将refreshUI() 内的Runnable 调用发布到view。那么它如何在 UI 线程上运行?

另一个奇怪的观察是,在我看到这个崩溃的情况下,广播发送服务甚至没有发送广播。我知道这一点,因为在发送方和接收方都有记录到 logcat 的语句。但其中之一是在崩溃之前存在的。

为了提供一些背景知识,上面的代码是在 Android 框架内编写的,用于键盘锁(或锁屏)。我正在开发为我们的硬件/板定制的 Android 4.3 源代码。

上述代码自过去 1.5 年以来一直存在。这个问题在过去几个月里只出现过两次,但这里没有任何改变。

我已经处理过Running on UIThread and posting to view, still get CalledFromWrongThreadException 和其他类似问题,但他们主要处理的是AsyncTasks。我没有AsyncTask

有什么想法吗?

【问题讨论】:

  • 使用 Activity.runOnUIThread(new Runnable...)
  • 我做不到。正如我所提到的,我的代码在默认的 Android-keyguard 中,它不是一个 Activity。它是一个直接通过 WindowManager 附加在 UI 上的视图。
  • 你能做到 ((Activity)view.getContext()).runOnUIThread... 吗?
  • @Nanoc 这不是一个活动。打字是行不通的。使用的上下文与 SystemServer 进程创建的上下文相同。
  • 你应该有办法调用runOnUIThread,请发布更多你的代码。

标签: android runnable android-framework


【解决方案1】:

当您想从非 UI 线程更新您的 UI 时,您必须使用 runOnUiThread()。例如,如果您想从后台线程更新您的 UI。你也可以使用 Handler 来做同样的事情。

你应该使用这个:

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            view.refreshUI();
        }
    });

【讨论】:

  • 想详细说明操作?即使他们确实回答了问题,直接回答也不是很好。
  • runOnUiThread 在 Activity 之外不可用。正如我在问题中提到的,此代码不在活动中运行
猜你喜欢
  • 2014-03-08
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 2023-01-28
  • 1970-01-01
相关资源
最近更新 更多