Was ist der Android UiThread (UI-Thread)

80

Kann mir jemand erklären, was genau der UI-Thread ist? Auf developer.android.com wird über die Funktion runOnUiThread berichtet

public final void runOnUiThread (Ausführbare Aktion)

Seit: API-Ebene 1 Führt die angegebene Aktion im UI-Thread aus. Wenn der aktuelle Thread der UI-Thread ist, wird die Aktion sofort ausgeführt. Wenn der aktuelle Thread nicht der UI-Thread ist, wird die Aktion in die Ereigniswarteschlange des UI-Threads gestellt.

Bedeutet der UI-Thread, dass dies jedes Mal ausgeführt wird, wenn die Aktivität durch eine UI-Aktivität wie eingehenden Anruf oder Bildschirmdimmen usw. in den Hintergrund gerückt wird? Wenn nicht, was genau enthält der UI-Thread?

Vielen Dank

user434885
quelle

Antworten:

142

Der UIThread ist der Hauptausführungsthread für Ihre Anwendung. Hier wird der größte Teil Ihres Anwendungscodes ausgeführt. Alle Ihre Anwendungskomponenten (Aktivitäten, Dienste, ContentProvider, BroadcastReceiver) werden in diesem Thread erstellt, und alle Systemaufrufe an diese Komponenten werden in diesem Thread ausgeführt.

Angenommen, Ihre Anwendung ist eine einzelne Aktivitätsklasse. Anschließend werden alle Lebenszyklusmethoden und der größte Teil Ihres Ereignisbehandlungscodes in diesem UIThread ausgeführt. Dies sind Methoden wie onCreate, onPause, onDestroy, onClicketc. Darüber hinaus ist das, wo alle Updates auf der Benutzeroberfläche vorgenommen werden. Alles, was dazu führt, dass die Benutzeroberfläche aktualisiert oder geändert wird, muss im UI-Thread geschehen.

Weitere Informationen zu den Prozessen und Threads Ihrer Anwendung finden Sie hier.

Wenn Sie explizit einen neuen Thread erzeugen, um im Hintergrund zu arbeiten, wird dieser Code nicht auf dem UIThread ausgeführt. Was passiert also, wenn dieser Hintergrund-Thread etwas tun muss, das die Benutzeroberfläche ändert? Dafür ist das da runOnUiThread. Eigentlich solltest du einen Handler verwenden (siehe den Link unten für weitere Informationen dazu). Diese Hintergrund-Threads können Code ausführen, mit dem die Benutzeroberfläche geändert werden kann. Dazu fügen sie den UI-modifizierenden Code in ein Runnable-Objekt ein und übergeben ihn an die runOnUiThread-Methode.

Weitere Informationen zum Laichen von Worker-Threads und zum Aktualisieren der Benutzeroberfläche finden Sie hier

Ich persönlich verwende die runOnUiThreadMethode nur in meinen Instrumentierungstests. Da der Testcode nicht im UIThread ausgeführt wird, müssen Sie diese Methode verwenden, um Code auszuführen, der die Benutzeroberfläche ändert. Ich verwende es also, um Klick- und Schlüsselereignisse in meine Anwendung einzufügen. Ich kann dann den Status der Anwendung überprüfen, um sicherzustellen, dass die richtigen Dinge passiert sind.

Weitere Informationen zum Testen und Ausführen von Code auf dem UIThread finden Sie hier

plainjimbo
quelle
3
Tolle Erklärung, speziell Link für App-Grundlagen, es ist ein Muss für alle Anfänger wie mich :)
Java Student
1
Sollten Sie nicht verwenden , AsyncTaskanstatt runOnUiThreadin den meisten Fällen?
JDJ
4
@JDJ die 2 Techniken haben unterschiedliche Zwecke: AsyncTaskSie werden vom Haupt-Thread in den Hintergrund versetzt; runOnUiThread()Sie gelangen aus dem Hintergrund auf den Haupt-Thread. Es kommt also darauf an, was Sie erreichen wollen.
Richard Le Mesurier
10

Wenn Sie Blockierungscode (z. B. eine HTTP-Anforderung) in einem separaten Thread ausführen , sollten Sie AsyncTask verwenden . Seine doInBackground-Methode läuft auf einem separaten Thread. AsyncTaskliefert Ihnen Methoden onProgressUpdateund onPostExecutewelche auf dem UI - Thread ausgeführt garantiert .

Wenn Sie Aktualisierungen des GUI-Fortschritts benötigen (z. B. über eine Fortschrittsleiste), rufen Sie publishProgressinnen auf doInBackground. Dies führte zu einem nachfolgenden Aufruf von onPublishProgressdem auch auf dem UI - Thread ausgeführt garantiert .

onPostExecutewird nach doInBackgroundRücksendung automatisch aufgerufen .

Martin Pabst
quelle
4

Alle UI-Zeichnungen usw. finden in einem separaten Thread statt. Es heißt UIThread. Wenn Sie Änderungen an der Benutzeroberfläche vornehmen möchten, müssen Sie sicherstellen, dass dies im Kontext von UIThread geschieht. Am einfachsten ist es, davon Gebrauch zu machenrunOnUiThread

the100rabh
quelle
Können Sie Widget-Datenstrukturen (wie das Aufblasen eines Layouts) in einem Nicht-UI-Thread vorbereiten und später in einem UI-Thread zeichnen?
SMBiggs
habe das nie versucht, aber technisch sollte es möglich sein, da inflate nur die Datenstruktur erstellt. Wenn Sie eine Aktivität anhängen usw., müssen Sie dies in einem UIThread-Kontext tun.
the100rabh