runOnUiThread vs Looper.getMainLooper (). Post in Android

99

Kann mir jemand sagen, ob es einen Unterschied zwischen der Verwendung von runOnUiThread () und Looper.getMainLooper (). Post () gibt, um eine Aufgabe im UI-Thread in Android auszuführen?

Das einzige, was ich feststellen kann, ist, dass Looper.getMainLooper (). Post () praktischer ist, wenn runOnUiThread eine nicht statische Aktivitätsmethode ist, wenn Sie etwas in einer Klasse codieren müssen, die die Aktivität nicht sehen kann (z eine Schnittstelle).

Ich bin nicht auf der Suche nach einer Diskussion darüber, ob etwas im UI-Thread ausgeführt werden soll. Ich verstehe, dass einige Dinge nicht können und viele Dinge nicht, jedoch MÜSSEN einige Dinge (wie das Starten einer AsyncTask) ausgeführt werden der UI-Thread.

Danke,
R.

Reich
quelle
6
Es gibt keinen Unterschied, außer dass runOnUiThreadüberprüft wird, ob es sich bereits um den UI-Thread handelt, und Ihre Aufgabe direkt ausgeführt wird, anstatt sie alsMessage
zapl
1
Vielen Dank. Würden Sie das bitte in eine Antwort umwandeln, damit ich es akzeptieren kann?
Rich
Außerdem habe ich bereits Code geschrieben, um zu überprüfen, ob im UI-Thread etwas ausgeführt wird, sodass es sehr einfach wäre, ihn manuell einzuschließen.
Rich

Antworten:

191

Folgendes verhält sich beim Aufrufen aus Hintergrundthreads gleich:

  • mit Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
  • mit Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);

Der einzige Unterschied besteht darin, wann Sie dies vom UI-Thread aus tun

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

prüft, ob der aktuelle Thread bereits der UI-Thread ist, und führt ihn dann direkt aus. Wenn Sie es als Nachricht veröffentlichen, wird die Ausführung verzögert, bis Sie von der aktuellen UI-Thread-Methode zurückkehren.

Es gibt auch eine dritte Möglichkeit, eine Runnableauf dem UI-Thread auszuführen View#post(Runnable): Diese sendet immer die Nachricht, auch wenn sie vom UI-Thread aufgerufen wird. Dies ist nützlich, da dadurch sichergestellt wird, dass Viewder Code ordnungsgemäß erstellt wurde und ein Layout aufweist, bevor der Code ausgeführt wird.

zapl
quelle