Quand utiliser handler.post () et quand à new Thread ()

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

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

Rend le Runnable r à append à la queue 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 :

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

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

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

Alors, disons que dans le callback (qui s’exécute dans un thread séparé), vous voulez changer le TextView un TextView , vous devez utiliser Handler.post() .

Dans Android, comme dans beaucoup d’autres frameworks d’interface utilisateur, les éléments d’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 sûr, si la tâche que vous souhaitez effectuer est très longue et que l’utilisateur risque de basculer entre-temps dans une autre application, vous devriez envisager d’utiliser un service .

Pour vous répondre à une question spécifique:

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

Handler 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 thread principal lui-même. Handler est simplement utilisé pour publier un message sur le thread auquel il est attaché (où il est créé). Il ne crée pas de thread seul. Dans votre exemple, vous avez créé un gestionnaire dans le thread principal (celui où Activity.OnCreate () est appelé) et, par conséquent, tout message envoyé sur un tel gestionnaire sera exécuté uniquement sur le thread principal.

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 post qui décrit la différence: que fait exactement la méthode post?

utilisez handler.post() lorsque vous souhaitez publier le code (généralement du thread d’arrière-plan) sur le thread principal . Oui, POST, comme vous, postez une lettre à quelqu’un. Avec l’aide du gestionnaire, le code sera exécuté ASAP, c’est-à-dire presque immédiatement.