web-dev-qa-db-fra.com

Quand utiliser handler.post () et quand utiliser un nouveau thread ()

Je me demande quand devrais-je utiliser handler.post(runnable); et quand devrais-je utiliser new Thread(runnable).start();

Il est mentionné dans la documentation pour les développeurs de Handler:

Rend le Runnable r être ajouté à la file d'attente des messages. Le runnable sera exécuté sur le thread auquel ce gestionnaire est attaché.

Est-ce que cela signifie que si j'écris dans la onCreate() de Activity classe:

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

alors runnable sera appelé dans un thread séparé ou dans le thread de l'activité?

55
reiley

Vous devez utiliser Handler.post() chaque fois que vous souhaitez effectuer des opérations dans le thread d'interface utilisateur.

Supposons donc que dans le rappel (qui s'exécute dans un fil séparé), vous vouliez changer le texte d'un TextView, vous devriez utiliser Handler.post().

Sous Android, comme dans de nombreux autres frameworks d'interface utilisateur, les éléments de l'interface utilisateur (widgets) ne peuvent être modifiés qu'à partir du thread principal.


Edit: l'exemple des tâches de longue durée

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();

Bien entendu, si la tâche que vous souhaitez effectuer est très longue et que l'utilisateur risque de basculer entre-temps vers une autre application, vous devez envisager d'utiliser Service .

82
kamituel

Pour répondre à une question spécifique:

Est-ce que cela signifie que si j'écris dans la classe onCreate of Activity:

Gestionnaire handler = new Handler () hanlder.post (exécutable); alors, runnable sera appelé dans un thread séparé ou sur le thread de l'activité?

Non ce ne sera pas. Le Runnable sera appelé sur le fil principal lui-même. Handler est simplement utilisé pour poster un message sur le fil auquel il est attaché (où il est créé). Il ne crée pas de fil tout seul. Dans votre exemple, vous avez créé un gestionnaire dans le thread principal (celui dans lequel Activity.OnCreate () est appelé) et, par conséquent, tout message publié sur un tel gestionnaire sera exécuté uniquement sur le thread principal.

26
pareshgoel

Exemple est jacked:

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

Sinon, vous pouvez ignorer le gestionnaire et utiliser directement la méthode post sur la vue:

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

Ceci est un bon article qui souligne la différence: Que fait exactement la méthode post?

12
worked

utilisez handler.post() quand vous voulez poster le code (généralement à partir du fil de fond) à la - filetage principal. Oui, POST, comme vous, postez une lettre à quelqu'un. Avec l'aide du gestionnaire , le code sera exécuté dès que possible, c'est-à-dire presque immédiatement.

6
user2768308