52

How can I know if the running code is executed on the main thread (UI thread)?
With Swing I use the isEventDispatchThread method...

Pang
  • 9,564
  • 146
  • 81
  • 122
Arutha
  • 26,088
  • 26
  • 67
  • 80

4 Answers4

125

Use Looper.getMainLooper().getThread() to get the UI thread. You can check if it is the current thread using the following expression:

Looper.getMainLooper().getThread() == Thread.currentThread()
Malcolm
  • 41,014
  • 11
  • 68
  • 91
Dan Syrstad
  • 1,259
  • 2
  • 8
  • 2
85

It is UI thread if:

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

Source AOSP source code: ManagedEGLContext.java#L100, SharedPreferencesImpl.java#L470, Instrumentation.java#L1650 and so on.

Brais Gabin
  • 5,827
  • 6
  • 57
  • 92
balazsbalazs
  • 4,071
  • 1
  • 24
  • 29
12

Doesn't look like there is a method for that in the SDK. The check is in the ViewRoot class and is done by comparing Thread.currentThread() to a class member which is assigned in the constructor but never exposed.

If you really need this check you have several options to implement it:

  1. catch the android.view.ViewRoot$CalledFromWrongThreadException
  2. post a Runnable to a view and check Thread.currentThread()
  3. use a Handler to do the same

In general I think instead of checking whether you're on the correct thread, you should just make sure the code is always executed on the UI thread (using 2. or 3.).

Josef Pfleger
  • 74,165
  • 16
  • 97
  • 99
2

If you want to know if you are in the main thread, you could maybe try:

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

Of course, I could be wrong, and this could totally blow your app up.

cesar
  • 8,944
  • 12
  • 46
  • 59