Есть ли надежный способ определить, является ли Thread.currentThread()
потоком пользовательского интерфейса Android в приложении?
Я хотел бы добавить некоторые утверждения в свой код модели, который утверждает, что только один поток (, например поток ui) обращается к моему состоянию, чтобы гарантировать, что никакой синхронизации не требуется.
Как определить поток пользовательского интерфейса на Android?
Ответ 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()
но это может быть немного читабельнее и легче запомнить.
Ответ 4
public boolean onUIThread() {
return Looper.getMainLooper().isCurrentThread();
}
Но для этого требуется уровень API 23
Ответ 5
Помимо проверки петлителя, если вы когда-либо пробовали logout thread id в onCreate()
, вы могли бы найти поток UI (основной поток) id всегда равно 1. Поэтому
if (Thread.currentThread().getId() == 1) {
// UI thread
}
else {
// other thread
}
Ответ 6
Нельзя использовать метод runOnUiThread
в классе Activity
? См.