Wie erkenne ich UI-Thread auf Android?

117

Gibt es eine zuverlässige Methode, um festzustellen, ob Thread.currentThread()sich der UI-Thread des Android-Systems in einer Anwendung befindet?
Ich möchte einige Asserts in meinen Modellcode einfügen, die behaupten, dass nur ein Thread ( z. B. der UI-Thread) auf meinen Status zugreift, um sicherzustellen, dass keine Art von Synchronisation erforderlich ist.

ParDroid
quelle
Siehe meine Antwort hier: stackoverflow.com/a/41280460/878126
Android-Entwickler

Antworten:

199

Die gängige Praxis zum Ermitteln der Identität des UI-Threads erfolgt über Looper # getMainLooper :

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

Ab API-Level 23 gibt es einen etwas besser lesbaren Ansatz mit der neuen Hilfsmethode isCurrentThread auf dem Hauptschleifer:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}
mik3y
quelle
6
stackoverflow.com/questions/11411022/… Diese Antwort ist auch nett)
UnknownJoe
44

Ich denke, der beste Weg ist folgender:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }
Atom
quelle
Funktioniert super. Danke dir!
Hong
3
Keine Notwendigkeit zu verwenden, equalsda wir nur Referenzen vergleichen und darüber hinaus beide statisch sind.
mr5
8

Ab API Level 23 Looperhat der eine nette Hilfsmethode isCurrentThread. Sie könnten das bekommen mainLooperund sehen, ob es das für den aktuellen Thread ist:

Looper.getMainLooper().isCurrentThread()

Es ist praktisch das gleiche wie:

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

aber es könnte ein bisschen lesbarer und leichter zu merken sein.

stan0
quelle
2

Neben der Prüfung Looper , wenn Sie jemals versucht , logout in Thread - ID onCreate(), können Sie das finden UI - Thread (Haupt - Thread) id immer auf 1 entspricht daher

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}
Yushulx
quelle
Ich kann keine offizielle Dokumentation finden, die bestätigt, dass dies wahr ist und immer so sein wird. Hast du einen Link?
Intrepidis
Dies habe ich in logcat gefunden, wenn ich das Multithread-Verhalten überwachen möchte. Sie können versuchen, Thread-ID
Yushulx
8
Ich würde dringend davon abraten, da dieser Wert möglicherweise spezifisch für Ihr Gerät und / oder Ihre Android-Version ist. Selbst wenn dies derzeit auf jedem Android-Gerät der Fall wäre, gibt es keine Garantie dafür, dass dies auch in späteren Versionen der Fall sein wird. Das Speichern der Thread-ID in einem Klassenmitglied beim Ausführen von onCreate () erscheint mir etwas vernünftiger.
personne3000
1

Könnten Sie die runOnUiThreadMethode nicht in der verwendenActivity Klasse verwenden? Siehe ..

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

Ridoy
quelle
4
Meine Anwendung funktioniert, hat aber mehrere Autoren und wird ziemlich groß und komplex. Was ich tun möchte, ist, ein zusätzliches Sicherheitsnetz hinzuzufügen, eine Behauptung, die den Fehler auffängt, wenn jemand eine Methode aufruft, die nur vom GUI-Thread eines anderen Threads aufgerufen werden soll.
ParDroid
Ich behebe derzeit einen Fehler, bei dem die Verwendung von runOnUiThread dazu führt, dass UX blinkt.
Fobbymaster