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

Есть ли надежный способ определить, является ли Thread.currentThread() потоком пользовательского интерфейса Android в приложении?
Я хотел бы добавить некоторые утверждения в свой код модели, который утверждает, что только один поток (, например поток ui) обращается к моему состоянию, чтобы гарантировать, что никакой синхронизации не требуется.

Ответ 1

Обычная практика для определения идентичности потока пользовательского интерфейса - Looper # getMainLooper:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

Начиная с уровня API 23 и выше, существует несколько более читаемый подход с использованием нового вспомогательного метода isCurrentThread в главном цикле:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

Ответ 2

Я думаю, что лучший способ:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

Ответ 3

На уровне API 23 у Looper есть хороший вспомогательный метод isCurrentThread. Вы можете получить mainLooper и посмотреть, подходит ли он для текущей темы следующим образом:

Looper.getMainLooper().isCurrentThread()

Это практически так же, как:

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

но это может быть немного читабельнее и легче запомнить.

Ответ 5

Помимо проверки петлителя, если вы когда-либо пробовали logout thread id в onCreate(), вы могли бы найти поток UI (основной поток) id всегда равно 1. Поэтому

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}