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

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

【问题讨论】:

  • 这个问题怎么重复?

标签: android multithreading


【解决方案1】:

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

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

  1. 捕获 android.view.ViewRoot$CalledFromWrongThreadException
  2. post a Runnable 查看并检查 Thread.currentThread()
  3. 使用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 的答案。
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多