如何检查Android中的UI线程是否运行?

Aru*_*tha 42 multithreading android

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

小智 110

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

Looper.getMainLooper().getThread() == Thread.currentThread()
Run Code Online (Sandbox Code Playgroud)

  • 所以只是为了显而易见,你可以做的实际检查是:(Looper.getMainLooper().getThread()== Thread.currentThread()) (6认同)

bal*_*azs 76

它是UI线程,如果:

Looper.myLooper() == Looper.getMainLooper()
Run Code Online (Sandbox Code Playgroud)

来源AOSP源代码:ManagedEGLContext.java#L100,SharedPreferencesImpl.java#L470,.Instrumentation.java#L1650

  • 值得注意的是,尽管bbalazs从ICS中提到它,但从API 1开始支持.所以应该对所有设备都安全! (5认同)

Jos*_*ger 11

在SDK中看起来没有方法.检查在ViewRoot类中,并通过与Thread.currentThread()构造函数中指定但从未公开的类成员进行比较来完成.

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

  1. 捕获android.view.ViewRoot $ CalledFromWrongThreadException
  2. posta Runnable到视图和检查Thread.currentThread()
  3. 用a Handler做同样的事

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


mic*_*ael 9

您也可以使用runOnUiThread,它只需要一个将在ui线程中运行的runnable

  • 可能值得注意的是,如果你从UI线程调用runOnUiThread,代码将与你的其余代码一起执行. (7认同)
  • 这并没有回答这个问题,即关于识别UI线程的问题,而不是关于在其上执行代码的问题. (2认同)