Domanda Quando utilizzare handler.post () e when to new Thread ()


Mi chiedo quando dovrei usare handler.post(runnable); e quando dovrei usare new Thread(runnable).start();

È menzionato nella documentazione degli sviluppatori per Handler:

Fa si che il Runnable r sia aggiunto alla coda dei messaggi. Il runnable   verrà eseguito sul thread a cui è collegato questo gestore.

Significa questo se scrivo nel onCreate() di Activity classe:

Handler handler = new Handler();
handler.post(runnable);

quindi eseguibile sarà chiamato in un thread separato o nella discussione dell'attività?


44
2018-02-28 13:00


origine


risposte:


Dovresti usare Handler.post() ogni volta che si desidera eseguire operazioni nel thread dell'interfaccia utente.

Quindi diciamo nel callback (che è in esecuzione in un thread separato) che vuoi modificare a TextViewIl testo, dovresti usare Handler.post().

In Android, come in molti altri framework UI, gli elementi dell'interfaccia utente (widget) possono essere modificati solo dal thread principale.


Modifica: l'esempio delle attività di lunga durata

mHandler = new Handler();

new Thread(new Runnable() {
  @Override
  public void run () {
    // Perform long-running task here
    // (like audio buffering).
    // you may want to update some progress
    // bar every second, so use handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on UI - on example
       // on progress bar.
     }
    });
  }
}).start();

Ovviamente, se l'attività che desideri eseguire è molto lunga e c'è il rischio che l'utente possa passare a un'altra app nel frattempo, dovresti considerare l'utilizzo di un Servizio.


72
2018-02-28 13:02



Per rispondere alla tua domanda specifica:

Significa questo se nella classe onCreate of Activity scrivo:

Handler handler = new Handler () hanlder.post (runnable); quindi, eseguibile   sarà chiamato in una discussione separata o nella discussione dell'attività?

No, non lo sarà. Il Runnable sarà chiamato sul Main Thread stesso. Il gestore viene semplicemente utilizzato per inviare un messaggio alla discussione a cui è collegato (dove viene creato). Non crea una discussione da sola. Nel tuo esempio, hai creato un Handler nel thread principale (quello in cui viene chiamato Activity.OnCreate ()) e quindi qualsiasi messaggio pubblicato su un tale Handler verrà eseguito solo sul Main Thread.


20
2018-03-07 07:54



L'esempio è jacked:

mHandler = new Handler();
new Thread(new Runnable(){
  @Override
  public void run () {
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

In alternativa puoi saltare il gestore e utilizzare direttamente il metodo post sulla vista:

new Thread(new Runnable(){
  @Override
  public void run () {
    mUiView.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

Questo è un buon post che delinea la differenza: Che cosa fa esattamente il metodo post?


11
2018-01-24 15:02



uso handler.post() quando vuoi inviare il codice (di solito dal thread in background) al filo principale. Sì, POST, proprio come te, posta una lettera a qualcuno. Con l'aiuto di gestore il codice verrà eseguito APPENA POSSIBILE quasi istantaneamente.


3
2018-03-27 00:14