138 votes

Android : Quand dois-je utiliser un Handler() et quand dois-je utiliser un Thread ?

Quand j'ai besoin de quelque chose pour courir de manière asynchrone comme un une tâche de longue haleine ou une logique qui utilise le réseau, ou pour n'importe quelle raison, le démarrage d'un nouveau fil et l'exécuter fonctionne bien. La création d'un Manipulateur et l'exécuter fonctionne aussi bien. Quelle est la différence ? Quand dois-je utiliser chacun d'eux ? Quels sont les avantages / raisons d'utiliser un Handler et non un Thread ?

PS. - Pour les besoins de cette question, ignorons AsyncTask . - Handler().postDelayed Le cas d'utilisation est clair pour moi, pour les besoins de cette question, supposons que la tâche doit commencer immédiatement.

0 votes

Dans votre situation, allez directement de l'avant et utilisez un nouveau Thread, ma prochaine suggestion serait AsyncTask mais ce n'est pas ce que vous voulez clairement. Les Handlers sont surtout utilisés si vous voulez ajouter un délai ou un autre type de personnalisation à un runnable.

1 votes

@kabuto178 eh bien, il y a d'autres avantages des handlers qui valent la peine d'être mentionnés et que vous avez omis. Par exemple, la possibilité d'interagir avec le thread de l'interface utilisateur à partir d'un thread séparé

173voto

FoamyGuy Points 26600

Si ce que vous faites est "lourd", vous devriez le faire dans un Thread. Si vous ne le lancez pas explicitement dans son propre thread, il s'exécutera sur le thread principal (UI), ce qui peut être perçu par vos utilisateurs comme une interface instable ou lente à répondre.

Il est intéressant de noter que lorsque vous utilisez un thread, il est souvent utile d'utiliser également un Handler comme moyen de communication entre le thread de travail que vous démarrez et le thread principal.

Une interaction typique entre Thread et Handler peut ressembler à ceci :

Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 0){
            updateUI();
        }else{
            showErrorDialog();
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler and it will do it for us.
            h.sendEmptyMessage(0);
        }else{
            h.sendEmptyMessage(1);
        }
    }   
};

D'une manière générale, il convient d'utiliser un thread chaque fois que vous effectuez un travail qui peut être long ou très intensif (c'est-à-dire tout ce qui concerne le réseau, les entrées/sorties de fichiers, l'arithmétique lourde, etc.)

0 votes

Merci pour la réponse rapide et le temps investi (et la rapidité de votre réponse !!)! Alors, voyons si j'ai bien compris : Le Handler est conçu pour faciliter la communication non bloquante entre les threads des travailleurs et le thread de l'interface utilisateur ?

3 votes

@JRun C'est une des utilisations oui. Consultez la description du Handler dans la documentation java. pour obtenir de bonnes informations à ce sujet. Y compris une autre de ses utilisations (pour planifier des messages et des exécutables à exécuter à un moment donné dans le futur).

0 votes

Joliment expliqué @FoamyGuy !

70voto

ben75 Points 11322

Handler et Thread sont en réalité deux choses différentes.

Un thread doit être créé pour exécuter les travaux de longue durée.

Un Handler est un objet très pratique pour communiquer entre 2 threads (par exemple : un thread d'arrière-plan doit mettre à jour l'interface utilisateur. Vous pouvez utiliser un Handler pour envoyer un Runnable de votre thread d'arrière-plan au thread de l'interface utilisateur).

Vous n'avez donc pas le choix entre Handler et Thread. Utilisez un thread pour les travaux lourds ! (vous pouvez utiliser un Handler si votre thread d'arrière-plan déclenche un travail à effectuer dans un autre thread - la plupart du temps, le thread de l'interface utilisateur).

0 votes

Merci pour la réponse rapide et le temps investi (et la rapidité de votre réponse !!)!

21voto

PearsonArtPhoto Points 14639

A Handler fonctionne sur le même Thread , a Thread fonctionne sur un autre fil.

Utilisez un Handler si vous devez exécuter quelque chose sur le même thread. généralement un élément d'interface graphique ou quelque chose comme ça.

Utilisez un Thread si vous voulez que le thread principal reste libre pour faire d'autres choses. . Utilisez ceci pour tout ce qui prend beaucoup de temps.

6 votes

Pourquoi devrais-je utiliser un handler si je veux exécuter quelque chose sur le même thread ? quel est le but de la méthode mHandler.post(...) ?

1 votes

Elias, dans ce cas, vous pouvez utiliser le gestionnaire si vous voulez qu'une certaine tâche s'exécute après un certain temps, ou pour répéter une tâche tous les X temps. Si vous ne voulez pas utiliser ces choses, vous avez raison. il n'est pas utile d'utiliser un gestionnaire. vous pouvez simplement faire les choses de l'interface graphique ici et là, parce que vous êtes dans le thread de l'interface utilisateur de toute façon, parce que le gestionnaire fonctionne sur le thread dans lequel il a été créé.

4voto

Beachwalker Points 1718

Si vous devez mettre à jour l'interface utilisateur f synchroniser avec le thread de l'interface utilisateur.

Vous pouvez utiliser la classe Android.os.Handler ou la classe AsyncTasks pour cela.

La classe Handler peut mettre à jour l'interface utilisateur. Un Handler fournit des méthodes pour recevoir des instances de la classe Message ou Runnable.

Votre fil de discussion peut envoyer des messages via la fonction sendMessage( ou via la méthode sendEmptyMessage().

... plus d'infos ici sur les threads, etc. (comprend des didacticiels sur les différents mécanismes de threads et de synchronisation et sur le moment où il faut les utiliser)

0 votes

Merci de prendre le temps de répondre à ma question. J'adore le blog de Lars Vogel, il est très perspicace et facile à suivre. Merci !

1voto

blackbelt Points 45840

Handler peut être utilisé en conjonction avec Thread afin de créer un mécanisme de mise en file d'attente. Vous pouvez utiliser l'option handler de poster quelque chose sur le Thread Looper

0 votes

Merci de prendre le temps de répondre à ma question. Pourquoi ne pas utiliser un Executor ? Et même si je voulais utiliser un Handler pour faire cela, comment ?

0 votes

L'exécuteur testamentaire est un peu différent. Pour l'utiliser, vous devez étendre thread et, dans l'exécution, appeler la méthode static.metohd prepare.de la classe Looper. Après avoir appelé la méthode static loop, une file d'attente est créée et vous pouvez utiliser un handler pour transmettre les demandes et obtenir les résultats.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X