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