Qual è la differenza tra Activity.runOnUiThreade View.post, qualcuno potrebbe, per favore, spiegare?
Qual è la differenza tra Activity.runOnUiThreade 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#runOnUiThreaddell'interfaccia utente , chiamerà il runmetodo direttamente, mentre View#postpubblicherà il runnablesulla 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 Runnableimmediatamente se ci troviamo sul thread dell'applicazione principale. post()mette sempre Runnablein coda, indipendentemente dal thread su cui viene chiamato.
runOnUiThread()controlla il thread corrente ed esegue Runnableimmediatamente 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 Activitye l'altro da un View. Ci sono molte sovrapposizioni tra questi, ma a volte in un Activitynon avrai accesso a un View, ea volte in un Viewnon avrai accesso a un Activity.
Uno dei casi limite che ho riscontrato l' View.postho menzionato in una risposta a un'altra domanda SOView.post : View.postfunziona solo da un altro thread quando Viewè collegato a una finestra. Questo è raramente un problema, ma a volte può far sì che il file Runnablenon venga mai eseguito, specialmente se chiami View.postnel onCreatemetodo del tuo Activity. Un'alternativa è usare quello Handler.postche è cosa Activity.runOnUiThreade View.postusare comunque sotto le coperte.
(modificato per precisione, aggiunto "da un altro thread")
onCreate()? Hm, in quel caso mi aspetto che venga inviato al Handlerfornito da ViewRoot.
View.postdovrei aggiungere il Runnablea 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.