如何检查是不是在 Android 的 UI 线程上运行? [复制]

Posted

技术标签:

【中文标题】如何检查是不是在 Android 的 UI 线程上运行? [复制]【英文标题】:How to check if running on UI thread in Android? [duplicate]如何检查是否在 Android 的 UI 线程上运行? [复制] 【发布时间】:2010-12-23 04:09:26 【问题描述】:

如何知道正在运行的代码是否在主线程(UI线程)上执行? 对于 Swing,我使用 isEventDispatchThread 方法...

【问题讨论】:

这个问题怎么重复? 【参考方案1】:

SDK 中似乎没有这样的方法。检查在ViewRoot 类中,通过将Thread.currentThread() 与在构造函数中分配但从未公开的类成员进行比较来完成。

如果你真的需要这个检查,你有几个选项来实现它:

    捕获 android.view.ViewRoot$CalledFromWrongThreadException post a Runnable 查看并检查 Thread.currentThread() 使用Handler 来做同样的事情

一般来说,我认为不是检查你是否在正确的线程上,你应该确保代码总是在 UI 线程上执行(使用 2 . 或 3.)。

【讨论】:

+1 for (3) 【参考方案2】:

使用 Looper.getMainLooper().getThread() 来获取 UI 线程。您可以使用以下表达式检查它是否是当前线程:

Looper.getMainLooper().getThread() == Thread.currentThread()

【讨论】:

所以为了明确起见,你可以做的实际检查是:(Looper.getMainLooper().getThread() == Thread.currentThread()) 这个答案需要更多的爱,非常感谢 你如何在junit中运行这个?【参考方案3】:

它是 UI 线程,如果:

Looper.myLooper() == Looper.getMainLooper()

源 AOSP 源代码:ManagedEGLContext.java#L100SharedPreferencesImpl.java#L470Instrumentation.java#L1650and so on。

【讨论】:

又短又甜。丢失getThread() 很整洁。 值得注意的是,虽然 bbalazs 从 ICS 中提到了它,但从 API 1 开始就支持这一点。所以应该对所有设备都是安全的! ➕1 供参考 AOSP 源代码。 你如何在junit中运行这个?【参考方案4】:

如果你想知道你是否在主线程中,你可以试试:

Context c = **Get a Context**;
Thread.currentThread() == c.getMainLooper().getThread();

当然,我可能是错的,这可能会让你的应用彻底崩溃。

【讨论】:

快速测试表明这很有效。 这行得通,但不需要获取上下文,请参阅 bbalazs 的答案。

以上是关于如何检查是不是在 Android 的 UI 线程上运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何知道这个线程是不是是 UI 线程

检测是不是在 WPF 和 Winforms 中的 UI 线程上

C#如何检查事件是不是异步执行

[转]Android限制只能在主线程中进行UI访问的实现原理

Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上

如何检查Android后台服务线程是不是正在运行