【发布时间】: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