web-dev-qa-db-fra.com

différence entre Thread et Handler

Quelqu'un peut-il me dire la déférence entre Thread et Handler? Quand nous utilisons Thread et quand nous utilisons Handler?

J'ai deux codes dans mon projet, mais je ne les comprends pas.

final Handler handler =  new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        //  Do SomeThings
    } 
};

Et

private class readThread extends Thread
{
    Handler mHandler;

    readThread(Handler h){
        mHandler = h;
        this.setPriority(Thread.MIN_PRIORITY);

    }

    @Override
    public void run()
    {
        //  Do SomeThings
    }
}

Et dans une autre méthode, appelez le gestionnaire comme celui-ci

read_thread = new readThread(handler);
            read_thread.start();

Lequel a couru en premier ?? Quelqu'un peut-il m'expliquer?

20
Khodayar

La même chose : vous pouvez à la fois exécuter la tâche de manière asynchrone sans bloquer votre code actuel,

La différence : Imaginez que vous avez un Runnable r = new Runnable{...}

  • Lorsque vous utilisez new Thread(r).start(), vous avez en fait créé un nouveau thread et exécuté la tâche de manière asynchrone.

  • Lorsque vous utilisez new Handler().post(r) (ou Message), vous avez ajouté l'objet Runnable à Looper et exécutez le code plus tard dans le même thread.

Un Thread, généralement MainThread ou UIThread contient un Looper. Lorsque MainThread s'exécute, il boucle le Looper et exécute Runnable un par un.

Lorsque le fil est préféré:

Lorsque vous effectuez un travail lourd comme la communication réseau ou le décodage de gros fichiers bitmap, un nouveau thread est préféré. Si beaucoup de threads sont nécessaires, peut-être que ExecutorService est davantage préféré. https://developer.Android.com/reference/Java/util/concurrent/ExecutorService.html

Lorsque le gestionnaire est préféré:

Lorsque vous souhaitez mettre à jour des objets d'interface utilisateur (comme TextView text) à partir d'un autre thread, il est nécessaire que les objets d'interface utilisateur puissent uniquement être mis à jour dans le thread d'interface utilisateur. En outre, lorsque vous souhaitez simplement exécuter du code léger plus tard (comme le délai de 300 ms), vous pouvez utiliser Handler car il est plus léger et plus rapide.

Veuillez également vous référer à Handler vs AsyncTask vs Thread

48
yjzhang

Les threads sont des tâches de traitement génériques qui peuvent faire la plupart des choses, mais une chose qu'ils ne peuvent pas faire est de mettre à jour l'interface utilisateur.

Les gestionnaires, d'autre part, sont des threads d'arrière-plan qui vous permettent de communiquer avec le thread d'interface utilisateur (mettre à jour l'interface utilisateur).

Ainsi, par exemple, affichez un toast ou une mise à jour d'une barre de progression via un message (Runnable) publié dans un gestionnaire, mais vous ne pouvez pas si vous démarrez cette runnable en tant que thread.

Avec le gestionnaire, vous pouvez également avoir des choses comme MessageQueuing, la planification et la répétition.

Je n'ai pas encore rencontré de situation où j'avais besoin d'un fil dans Android.

J'utilise principalement une combinaison d'AsyncTasks et de gestionnaires.

Gestionnaires pour les tâches susmentionnées.

AsyncTasks pour le téléchargement/l'extraction et l'interrogation de données, etc.

3
Darshan Mistry

Thread crée en fait un nouveau thread - une partie du travail s'exécutant en arrière-plan par rapport au thread actuel.

Handler lui-même ne fournit aucun mécanisme pour le travail en arrière-plan - c'est juste un outil pour accéder à la file d'attente de messages (Looper) associée à un thread. Le thread d'interface utilisateur a Looper attaché par défaut, il est donc courant de mettre à jour l'interface utilisateur avec Handler.post(Runable) ce qui signifie exécuter un morceau de code sur le thread associé à ce Handler.
Dès que Handler sert Looper, il ne peut pas être créé dans un thread auquel aucun Looper n'est associé.

2
Viacheslav