android — Как обнаружить поток пользовательского интерфейса на Android?" />

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

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

103 голоса | спросил ParDroid 17 Maypm10 2010, 15:26:08

6 ответов


0

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

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}
ответил mik3y 26 +04002011-10-26T04:50:35+04:00312011bEurope/MoscowWed, 26 Oct 2011 04:50:35 +0400 2011, 04:50:35
0

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

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }
ответил ATom 6 PMpFri, 06 Apr 2012 23:56:31 +040056Friday 2012, 23:56:31
0
public boolean onUIThread() {
    return Looper.getMainLooper().isCurrentThread();

}

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

ответил cmicat 4 FebruaryEurope/MoscowbThu, 04 Feb 2016 11:11:50 +0300000000amThu, 04 Feb 2016 11:11:50 +030016 2016, 11:11:50
0

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

Looper.getMainLooper().isCurrentThread()

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

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

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

ответил stan0 12 FebruaryEurope/MoscowbMon, 12 Feb 2018 16:01:32 +0300000000pmMon, 12 Feb 2018 16:01:32 +030018 2018, 16:01:32
0

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

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}
ответил yushulx 10 J000000Wednesday13 2013, 18:56:02
0

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

http: //developer .android.com /ссылка /Android /приложение /Activity.html # runOnUiThread% 28java.lang.Runnable% 29

ответил 17 Maypm10 2010, 16:07:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132