Как проверить, работает ли в потоке пользовательского интерфейса в Android?

Как узнать, выполняется ли исполняемый код в основном потоке (поток пользовательского интерфейса)?
С Swing я использую метод isEventDispatchThread

Solutions Collecting From Web of "Как проверить, работает ли в потоке пользовательского интерфейса в Android?"

Не похоже, что в SDK есть метод. Проверка выполняется в классе ViewRoot и выполняется путем сравнения Thread.currentThread() с членом класса, который назначается в конструкторе, но никогда не отображается.

Если вам действительно нужна эта проверка, у вас есть несколько вариантов ее реализации:

  1. Уловить android.view.ViewRoot $ CalledFromWrongThreadException
  2. Thread.currentThread() Runnable для просмотра и проверить Thread.currentThread()
  3. Используйте Handler чтобы сделать то же самое

В общем, я думаю, вместо того, чтобы проверять правильность потока, вы должны просто убедиться, что код всегда выполняется в потоке пользовательского интерфейса (с использованием 2. или 3.).

Используйте Looper.getMainLooper (). GetThread (), чтобы получить поток пользовательского интерфейса. Вы можете проверить, является ли это текущим потоком, используя следующее выражение:

 Looper.getMainLooper().getThread() == Thread.currentThread() 

Это поток пользовательского интерфейса, если:

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

Исходный исходный код AOSP: ManagedEGLContext.java#L100 , SharedPreferencesImpl.java#L470 , Instrumentation.java#L1650 и т . Д.

Вы также можете использовать runOnUiThread , для этого требуется только runnable, который будет запускаться в потоке ui

Если вы хотите узнать, находитесь ли вы в основном потоке, вы можете попробовать:

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

Конечно, я могу ошибаться, и это может полностью взорвать ваше приложение.