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
, onClick
etc. 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 runOnUiThread
Methode 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
AsyncTask
anstattrunOnUiThread
in den meisten Fällen?AsyncTask
Sie 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.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.AsyncTask
liefert Ihnen MethodenonProgressUpdate
undonPostExecute
welche auf dem UI - Thread ausgeführt garantiert .Wenn Sie Aktualisierungen des GUI-Fortschritts benötigen (z. B. über eine Fortschrittsleiste), rufen Sie
publishProgress
innen aufdoInBackground
. Dies führte zu einem nachfolgenden Aufruf vononPublishProgress
dem auch auf dem UI - Thread ausgeführt garantiert .onPostExecute
wird nachdoInBackground
Rücksendung automatisch aufgerufen .quelle
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 machen
runOnUiThread
quelle