2010-05-17 3 views
95

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

+0

См. Мой ответ здесь: http://stackoverflow.com/a/41280460/878126 –

ответ

1

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

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

+4

Мое приложение работает, но у него есть несколько авторов и оно является довольно большим и сложным. То, что я хочу сделать, это добавить дополнительную защитную сетку, утверждать, что улавливает ошибку, если кто-то вызывает метод, который предназначен для вызова только из потока GUI из другого потока. – ParDroid

+0

В настоящее время я исправляю ошибку, в которой использование runOnUiThread приводит к тому, что UX будет мигать. – fobbymaster

163

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

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

http://stackoverflow.com/questions/11411022/how-to-check-if-current-thread-is-not-main-thread Этот ответ тоже приятный) – UnknownJoe

42

Я думаю, что наилучший способ заключается в следующем:

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

Отлично работает. Спасибо! – Hong

+0

Лучше с равными, спасибо! –

+3

Не нужно использовать 'equals', так как мы сравниваем ссылки, и, кроме того, они оба статичны. – mr5

2

Помимо проверки петлителя, если вы когда-нибудь пробовали выход из системы идентификатора потока в onCreate(), вы могли бы найти нить UI (основную нить) идентификатора всегда равен 1. Поэтому

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

Я не могу найти официальную документацию, подтверждающую, что это правда, и всегда будет так. У вас есть ссылка? –

+0

Это то, что я нашел в logcat, когда хочу контролировать многопоточное поведение. Вы можете попытаться вывести thread id – yushulx

+8

Я бы настоятельно рекомендовал против этого, так как это значение может быть специфичным для вашего устройства и/или версии Android. Даже если бы это было на каждом устройстве Android прямо сейчас, нет никакой гарантии, что это будет продолжаться в более поздних версиях. Сохранение идентификатора потока в члене класса при запуске onCreate() кажется мне более разумным. – personne3000

0

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

Looper.getMainLooper().isCurrentThread() 

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

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

, но это может быть немного более удобным для чтения и легче запомнить ,

Смежные вопросы