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é?
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 .
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.
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?
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.