runOnUiThread vs Looper.getMainLooper (). post in Android


99

Qualcuno può dirmi se c'è qualche differenza tra l'utilizzo di runOnUiThread () e Looper.getMainLooper (). Post () per eseguire un'attività sul thread dell'interfaccia utente in Android ??

L'unica cosa che posso determinare è che poiché runOnUiThread è un metodo Activity non statico, Looper.getMainLooper (). Post () è più conveniente quando è necessario codificare qualcosa in una classe che non può vedere l'attività (come un'interfaccia).

Non sto cercando una discussione su SE qualcosa dovrebbe essere eseguito sul thread dell'interfaccia utente, ho capito che alcune cose non possono e molte cose non dovrebbero, tuttavia alcune cose (come l'avvio di un AsyncTask) DEVONO essere eseguite da il thread dell'interfaccia utente.

Grazie,
R.


6
Non c'è differenza tranne che runOnUiThreadcontrollerà se è già il thread dell'interfaccia utente ed eseguirà direttamente l'attività invece di pubblicarla come aMessage
zapl

1
Grazie. Potresti convertirlo in una risposta, così posso accettarlo?
Rich

Inoltre, ho già scritto del codice per verificare se qualcosa viene eseguito sul thread dell'interfaccia utente, quindi sarebbe molto semplice includerlo manualmente.
Rich

Risposte:


192

Quanto segue si comporta allo stesso modo quando viene chiamato dai thread in background:

  • utilizzando Looper.getMainLooper()

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

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

L'unica differenza è quando lo fai dal thread dell'interfaccia utente da allora

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

controllerà se il thread corrente è già il thread dell'interfaccia utente e quindi lo eseguirà direttamente. Pubblicarlo come messaggio ritarderà l'esecuzione fino a quando non torni dal metodo del thread dell'interfaccia utente corrente.

C'è anche un terzo modo per eseguire un Runnablesul thread dell'interfaccia utente che sarebbe View#post(Runnable): questo inserirà sempre il messaggio anche quando viene chiamato dal thread dell'interfaccia utente. Ciò è utile poiché assicurerà che Viewsia stato costruito correttamente e abbia un layout prima che il codice venga eseguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.