如何检查是不是在 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#L100
、SharedPreferencesImpl.java#L470
、Instrumentation.java#L1650
and so on。
【讨论】:
又短又甜。丢失getThread()
很整洁。
值得注意的是,虽然 bbalazs 从 ICS 中提到了它,但从 API 1 开始就支持这一点。所以应该对所有设备都是安全的!
➕1 供参考 AOSP 源代码。
你如何在junit中运行这个?【参考方案4】:
如果你想知道你是否在主线程中,你可以试试:
Context c = **Get a Context**;
Thread.currentThread() == c.getMainLooper().getThread();
当然,我可能是错的,这可能会让你的应用彻底崩溃。
【讨论】:
快速测试表明这很有效。 这行得通,但不需要获取上下文,请参阅 bbalazs 的答案。以上是关于如何检查是不是在 Android 的 UI 线程上运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
检测是不是在 WPF 和 Winforms 中的 UI 线程上
[转]Android限制只能在主线程中进行UI访问的实现原理