401 Stimmen

Ausführen von Code im Hauptthread von einem anderen Thread aus

In einem Android-Dienst habe ich Thread(s) erstellt, um einige Hintergrundaufgaben zu erledigen.

Ich habe eine Situation, in der ein Thread eine bestimmte Aufgabe in die Nachrichtenwarteschlange des Hauptthreads stellen muss, zum Beispiel eine Runnable .

Gibt es eine Möglichkeit, die Handler des Hauptthemas und posten Message / Runnable aus meinem anderen Thread?

6voto

philoopher97 Punkte 566
ContextCompat.getMainExecutor(context).execute {
  // do something
}

5voto

Dheeraj Vepakomma Punkte 19844

Eine Methode, die mir einfällt, ist die folgende:

1) Lassen Sie die Benutzeroberfläche an den Dienst binden.
2) Legen Sie eine Methode wie die folgende durch die Binder das Ihre Daten registriert Handler :

public void registerHandler(Handler handler) {
    mHandler = handler;
}

3) Rufen Sie im UI-Thread die obige Methode nach der Bindung an den Dienst auf:

mBinder.registerHandler(new Handler());

4) Verwenden Sie den Handler im Thread des Dienstes, um Ihre Aufgabe zu veröffentlichen:

mHandler.post(runnable);

5voto

HotJard Punkte 4148

Am praktischsten ist es also, so etwas zu tun:

import android.os.AsyncTask
import android.os.Handler
import android.os.Looper

object Dispatch {
    fun asyncOnBackground(call: ()->Unit) {
        AsyncTask.execute {
            call()
        }
    }

    fun asyncOnMain(call: ()->Unit) {
        Handler(Looper.getMainLooper()).post {
            call()
        }
    }
}

Und danach:

Dispatch.asyncOnBackground {
    val value = ...// super processing
    Dispatch.asyncOnMain { completion(value)}
}

3voto

MarGin Punkte 1780

Befolgen Sie diese Methode. Auf diese Weise können Sie die Benutzeroberfläche einfach von einem Hintergrund-Thread aus aktualisieren. runOnUiThread arbeitet auf dem main(UI)-Thread. Ich denke, dieses Code-Snippet ist weniger komplex und einfach, besonders für Anfänger.

AsyncTask.execute(new Runnable() {
            @Override
            public void run() {

            //code you want to run on the background
            someCode();

           //the code you want to run on main thread
 MainActivity.this.runOnUiThread(new Runnable() {

                    public void run() {

/*the code you want to run after the background operation otherwise they will executed earlier and give you an error*/
                        executeAfterOperation();

                   }
                });
            }
        });

im Falle einer Dienstleistung

einen Handler in der Oncreate-Funktion erstellen

 handler = new Handler();

dann verwenden Sie es wie folgt

 private void runOnUiThread(Runnable runnable) {
        handler.post(runnable);
    }

2voto

Francis Punkte 5753

Für Kotlin, können Sie Anko-Korountinen :

Update

doAsync {
   ...
}

Abgelehnt

async(UI) {
    // Code run on UI thread
    // Use ref() instead of this@MyActivity
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X