2013-02-28 5 views
40

Je me demande quand dois-je utiliser handler.post(runnable); et quand dois-je utiliser new Thread(runnable).start();Quand utiliser handler.post() et quand une nouvelle discussion()

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

Oblige le runnable r à être ajouté à la file d'attente de messages. Le fichier exécutable sera exécuté sur le thread auquel ce gestionnaire est connecté.

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

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

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

Répondre

64

Vous devez utiliser Handler.post() chaque fois que vous souhaitez effectuer des opérations dans le thread d'interface utilisateur. Par exemple, dans le rappel (qui s'exécute dans un thread séparé) que vous souhaitez modifier le texte d'un TextView, vous devez utiliser Handler.post().

Dans Android, comme dans de nombreux autres cadres 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 sûr, si la tâche que vous voulez effectuer est très long et il y a un risque que l'utilisateur peut passer à une autre application dans En attendant, vous devriez envisager d'utiliser un Service.

+0

Mais si je dis que je veux mettre en tampon un flux audio à partir d'Internet. Dois-je le faire via handler.post ou par nouveau thread? – reiley

+1

dépend vraiment de vos besoins. Je considérerais soit un nouveau fil ou un service. Je vais mettre à jour la réponse avec un exemple en une seconde. – kamituel

11

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 sauter le gestionnaire et utiliser la méthode post sur la vue directement:

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

Ceci est un bon poste qui décrit la différence: What exactly does the post method do?

18

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

Cela signifie-t-il que, dans la classe onCreate of Activity, j'écris:

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

Non ce ne sera pas. Le Runnable sera appelé sur le thread principal lui-même. Le gestionnaire est simplement utilisé pour envoyer un message au 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 posté sur un tel gestionnaire sera exécuté sur le thread principal uniquement.

+3

Les bonnes réponses ne sont pas toujours sélectionnées comme étant les meilleures. Merci –

+0

Vous venez de changer complètement les perfs de mon application !! Passer d'un gestionnaire à un fil juste fait voler mon appli! Donc grand merci l'homme !! – Mitchapp

2

utilisation handler.post() lorsque vous souhaitez après le code (habituellement de fil d'arrière-plan) au thread 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.

Questions connexes