2009-12-04 5 views

Antwort

8

Sieht nicht wie es gibt eine Methode dafür im SDK. Die Prüfung findet in der Klasse ViewRoot statt und erfolgt durch Vergleichen von Thread.currentThread() mit einem Klassenelement, das zwar im Konstruktor zugewiesen ist, aber nie verfügbar ist.

Wenn Sie dies überprüfen Sie es mehrere Möglichkeiten zu implementieren wirklich:

  1. fangen die android.view.ViewRoot $ CalledFromWrongThreadException
  2. post ein Runnable zu einer Ansicht und überprüfen Thread.currentThread()
  3. Verwendung ein Handler um das gleiche zu tun

Generell denke ich statt Überprüfung ob Sie auf dem richtigen Thread sind, sollten Sie nur stellen Sie sicher der Code wird immer auf dem UI-Thread ausgeführt (mit 2. oder 3.).

+0

+1 für (3) Will

104

Verwenden Sie Looper.getMainLooper(). GetThread(), um den UI-Thread abzurufen. Sie können prüfen, ob es den aktuellen Thread mit dem folgenden Ausdruck ist:

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

Aus Gründen der Genauigkeit können Sie also Folgendes tun: (Looper.getMainLooper(). GetThread() == Thread.currentThread()) – greg7gkb

+0

Diese anwer braucht mehr Liebe, vielen Dank – Inverce

9

Sie auch runOnUiThread verwenden können, bedarf es nur ein lauffähiges, die

+7

Könnte es sein, dass, wenn Sie runOnUiThread aus dem UI-Thread aufrufen, der Code in-line mit dem Rest Ihres Codes ausgeführt wird. – stork

+0

Dies beantwortet nicht die Frage, die darin besteht, den UI-Thread zu identifizieren und nicht Code darauf auszuführen. – CJBS

76

Es ist UI-Thread, wenn in dem UI-Thread ausgeführt werden:

Looper.myLooper() == Looper.getMainLooper() 

Quelle AOSP Quellcode: ManagedEGLContext.java#L100, SharedPreferencesImpl.java#L470, Instrumentation.java#L1650and so on.

+0

Kurz und süß. Das 'getThread()' zu verlieren ist ordentlich. – ahcox

+5

Bemerkenswert, obwohl bbalazs dies von ICS erwähnt, wird dies ab API 1 unterstützt. So sollte für alle Geräte sicher sein! –

+0

➕1 als Referenz zur AOSP-Quelle. – CJBS

2

Wenn Sie wissen wollen, ob Sie im Hauptthread sind, könnten Sie vielleicht versuchen:

Context c = **Get a Context**; 
Thread.currentThread() == c.getMainLooper().getThread(); 

Natürlich, ich könnte falsch sein, und das ist völlig Ihre App die Luft sprengen könnte.

+0

Ein schneller Test deutet darauf hin, dass dies gut funktioniert. –

+0

Dies funktioniert, aber es ist nicht notwendig, einen Kontext zu erhalten, siehe bbalazs Antwort. –

Verwandte Themen