Как обнаружить поток пользовательского интерфейса на Android? - PullRequest
108 голосов
/ 17 мая 2010

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

Ответы [ 6 ]

188 голосов
/ 26 октября 2011

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

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}
44 голосов
/ 06 апреля 2012

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

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }
8 голосов
/ 12 февраля 2018

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

Looper.getMainLooper().isCurrentThread()

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

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

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

6 голосов
/ 04 февраля 2016
public boolean onUIThread() {
    return <a href="https://developer.android.com/reference/android/os/Looper.html" rel="nofollow noreferrer">Looper</a>.<a href="https://developer.android.com/reference/android/os/Looper.html#getMainLooper()" rel="nofollow noreferrer">getMainLooper()</a>.<a href="https://developer.android.com/reference/android/os/Looper.html#isCurrentThread()" rel="nofollow noreferrer">isCurrentThread()</a>;

}

Но для этого требуется уровень API 23

2 голосов
/ 10 июля 2013

Помимо проверки looper , если вы когда-либо пытались выйти из системы идентификатор потока в onCreate(), вы могли бы найти поток пользовательского интерфейса (основной поток) идентификатор всегда равно 1. Следовательно,

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}
1 голос
/ 17 мая 2010

Не могли бы вы использовать метод runOnUiThread в классе Activity? См.

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...