Есть ли надежный способ определить, является ли Thread.currentThread()
элементом пользовательского интерфейса Android в приложении?
Я хотел бы добавить несколько утверждений в свой код модели, который утверждает, что только один поток (, например, поток ui) обращается к моему состоянию, чтобы гарантировать, что никакой синхронизации не требуется.Как определить поток пользовательского интерфейса на Android?
ответ
не могли бы вы использовать метод runOnUiThread
в Activity
классе См ..
Мое приложение работает, но у него есть несколько авторов и оно является довольно большим и сложным. То, что я хочу сделать, это добавить дополнительную защитную сетку, утверждать, что улавливает ошибку, если кто-то вызывает метод, который предназначен для вызова только из потока GUI из другого потока. – ParDroid
В настоящее время я исправляю ошибку, в которой использование runOnUiThread приводит к тому, что UX будет мигать. – fobbymaster
обычная практика, чтобы определить идентичность поток пользовательского интерфейса является через Looper#getMainLooper:
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
// On UI thread.
} else {
// Not on UI thread.
}
http://stackoverflow.com/questions/11411022/how-to-check-if-current-thread-is-not-main-thread Этот ответ тоже приятный) – UnknownJoe
Я думаю, что наилучший способ заключается в следующем:
if (Looper.getMainLooper().equals(Looper.myLooper())) {
// UI thread
} else {
// Non UI thread
}
Помимо проверки петлителя, если вы когда-нибудь пробовали выход из системы идентификатора потока в onCreate()
, вы могли бы найти нить UI (основную нить) идентификатора всегда равен 1. Поэтому
if (Thread.currentThread().getId() == 1) {
// UI thread
}
else {
// other thread
}
Я не могу найти официальную документацию, подтверждающую, что это правда, и всегда будет так. У вас есть ссылка? –
Это то, что я нашел в logcat, когда хочу контролировать многопоточное поведение. Вы можете попытаться вывести thread id – yushulx
Я бы настоятельно рекомендовал против этого, так как это значение может быть специфичным для вашего устройства и/или версии Android. Даже если бы это было на каждом устройстве Android прямо сейчас, нет никакой гарантии, что это будет продолжаться в более поздних версиях. Сохранение идентификатора потока в члене класса при запуске onCreate() кажется мне более разумным. – personne3000
public boolean onUIThread() {
return Looper . getMainLooper() . isCurrentThread() ;
}
Но для этого требуется уровень API 23
Полезно знать! –
С уровня API 23 Looper
имеет хороший вспомогательный метод isCurrentThread
. Вы можете получить mainLooper
и посмотреть, если это один для текущего потока таким образом:
Looper.getMainLooper().isCurrentThread()
Это практически то же самое, как:
Looper.getMainLooper().getThread() == Thread.currentThread()
, но это может быть немного более удобным для чтения и легче запомнить ,
- 1. Как определить поток потока пользовательского интерфейса
- 2. Определить, что блокирует поток пользовательского интерфейса
- 3. Android: Как запустить фоновый поток и поток пользовательского интерфейса одновременно?
- 4. Служба Android останавливает основной поток пользовательского интерфейса
- 5. HttpWebRequest.BeginGetRequestStream блокирующий поток пользовательского интерфейса
- 6. EKEventStore блокирует поток пользовательского интерфейса
- 7. Camera.open() блокирующий поток пользовательского интерфейса
- 8. Кодированный тест пользовательского интерфейса медленно ждет поток пользовательского интерфейса
- 9. Eclipse RCP: Как уведомить поток пользовательского интерфейса
- 10. onLocationChanged callback делается на какой поток? Основной поток пользовательского интерфейса?
- 11. Почему соединение JDBC задерживает поток пользовательского интерфейса?
- 12. Идентификатор темы пользовательского интерфейса Android
- 13. как приостановить поток пользовательского интерфейса в javascript
- 14. Как не замораживать поток пользовательского интерфейса?
- 15. Как избежать Admob, блокирующего поток пользовательского интерфейса
- 16. Как начать поток пользовательского интерфейса в C#
- 17. Как фоновый поток может повесить поток пользовательского интерфейса?
- 18. Как определить касание изображения пользовательского интерфейса?
- 19. Android Junit4 тест на тему пользовательского интерфейса
- 20. Синхронизировать тестовую нить, поток пользовательского интерфейса и поток CursorLoader
- 21. Как ссылаться на поток пользовательского интерфейса компонента WinForm?
- 22. Дизайн пользовательского интерфейса Android?
- 23. Ошибка пользовательского интерфейса android
- 24. Phonegap - запрос Sqlite зависает поток пользовательского интерфейса в Android
- 25. Рабочий блокирующий поток пользовательского интерфейса в Chrome
- 26. Как определить, находимся ли мы в потоке пользовательского интерфейса?
- 27. Получение int в поток пользовательского интерфейса
- 28. Android: прослушивающая нить Bluetooth блокирует поток пользовательского интерфейса
- 29. Thread.sleep() блокирует основной поток пользовательского интерфейса
- 30. C# не реагирующих второй поток пользовательского интерфейса
См. Мой ответ здесь: http://stackoverflow.com/a/41280460/878126 –