如何检查在Android的UI线程上运行?
我怎么知道运行的代码是否在主线程(UI线程)上执行?
使用Swing我使用isEventDispatchThread
方法…
看起来不像SDK中有一个方法。 该检查位于ViewRoot
类中,并通过将Thread.currentThread()
与在构造函数中分配但从未公开的类成员进行比较来完成。
如果你真的需要这个检查你有几个选项来实现它:
- 捕获android.view.ViewRoot $ CalledFromWrongThreadException
-
post
一个Runnable
到视图并检查Thread.currentThread()
- 使用
Handler
来做同样的事情
一般来说,我认为不是检查你是否在正确的线程上,而是应该确保代码总是在UI线程上执行(使用2或3)。
使用Looper.getMainLooper()。getThread()来获取UI线程。 您可以使用以下expression式检查它是否是当前线程:
Looper.getMainLooper().getThread() == Thread.currentThread()
这是UI线程,如果:
Looper.myLooper() == Looper.getMainLooper()
源代码AOSP源代码: ManagedEGLContext.java#L100
, SharedPreferencesImpl.java#L470
, Instrumentation.java#L1650
等等 。
你也可以使用runOnUiThread ,它只需要一个将在ui线程中运行的runnable
如果你想知道你是否在主线程,你可以尝试:
Context c = **Get a Context**; Thread.currentThread() == c.getMainLooper().getThread();
当然,我可能是错的,这可能会完全打击你的应用程序。