Qual è la differenza tra Activity.runOnUiThread
e View.post
, qualcuno potrebbe, per favore, spiegare?
Qual è la differenza tra Activity.runOnUiThread
e View.post
, qualcuno potrebbe, per favore, spiegare?
Risposte:
Non c'è alcuna differenza reale, tranne che View.post
è utile quando non si ha un accesso diretto all'attività.
In entrambi i casi, se non su thread UI, Handler#post(Runnable)
verrà chiamato dietro le quinte.
Come menzionato da CommonsWare nel commento, c'è una differenza tra i due: quando viene chiamato sul thread Activity#runOnUiThread
dell'interfaccia utente , chiamerà il run
metodo direttamente, mentre View#post
pubblicherà il runnable
sulla coda (ad esempio, chiama il Handler#post
)
Il punto importante IMO è che entrambi hanno lo stesso obiettivo e, per chiunque lo utilizzi, non dovrebbe esserci alcuna differenza (e l'implementazione potrebbe cambiare in futuro).
runOnUiThread()
controlla il thread corrente ed esegue Runnable
immediatamente se ci troviamo sul thread dell'applicazione principale. post()
mette sempre Runnable
in coda, indipendentemente dal thread su cui viene chiamato.
runOnUiThread()
controlla il thread corrente ed esegue Runnable
immediatamente se ci troviamo nel thread principale dell'applicazione " (enfasi aggiunta). "Significa che ciò che è attualmente sul thread dell'interfaccia utente viene ignorato e a questo viene data la priorità?" - "ciò che è attualmente nel thread dell'interfaccia utente" è la runOnUiThread()
chiamata.
Un'altra differenza tra Activity.runOnUiThread e view.post () è che il runnable in view.post () viene chiamato dopo che la vista è attaccata a una finestra.
Entrambi sono accettabili per la maggior parte delle situazioni e per la maggior parte sono intercambiabili, ma sono leggermente diversi. La più grande differenza, ovviamente, è che uno è disponibile da un Activity
e l'altro da un View
. Ci sono molte sovrapposizioni tra questi, ma a volte in un Activity
non avrai accesso a un View
, ea volte in un View
non avrai accesso a un Activity
.
Uno dei casi limite che ho riscontrato l' View.post
ho menzionato in una risposta a un'altra domanda SOView.post
: View.post
funziona solo da un altro thread quando View
è collegato a una finestra. Questo è raramente un problema, ma a volte può far sì che il file Runnable
non venga mai eseguito, specialmente se chiami View.post
nel onCreate
metodo del tuo Activity
. Un'alternativa è usare quello Handler.post
che è cosa Activity.runOnUiThread
e View.post
usare comunque sotto le coperte.
(modificato per precisione, aggiunto "da un altro thread")
onCreate()
? Hm, in quel caso mi aspetto che venga inviato al Handler
fornito da ViewRoot
.
View.post
dovrei aggiungere il Runnable
a una coda da eseguire in seguito se non è ancora allegato. Non ho approfondito molto il codice sorgente, ma i documenti dicono: "Questo metodo può essere richiamato dall'esterno del thread dell'interfaccia utente solo quando questa vista è collegata a una finestra". Quindi penso che se è nel thread corrente, allora quello che hai detto è vero, se non lo è allora probabilmente inghiotte solo il Runnable
. Sicuramente è successo nel mio codice.