différence entre Thread et Handler
Quelqu'un peut-il me dire la déférence entre le Fil et le Gestionnaire? Lorsque nous utilisons Fil et lorsque nous utilisons Gestionnaire?
J'ai deux code dans mon projet , Mais je ne peux pas les comprendre.
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 de l'appel du gestionnaire comme ce
read_thread = new readThread(handler);
read_thread.start();
Laquelle on exécute d'abord?? Quelqu'un peut-il m'expliquer?
source d'informationauteur Khodayar
Vous devez vous connecter pour publier un commentaire.
La même: vous pouvez exécuter la tâche de façon 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 réellement créé un nouveau thread pour exécuter la tâche de façon asynchrone.Lorsque vous utilisez
new Handler().post(r)
(ouMessage
), vous avez ajouté leRunnable
objet deLooper
et exécuter le code plus tard dans le même thread.Un
Thread
généralementMainThread
ouUIThread
contient unLooper
. LorsqueMainThread
s'exécute, elle boucle laLooper
et exécuterRunnable
un par un.Lorsque le Thread est préféré:
Lorsque vous êtes en train de faire un travail lourd comme réseau de communication, ou de décodage de gros fichiers bitmap, un nouveau thread est préféré. Si beaucoup de fil est nécessaire, peut-être
ExecutorService
est préféré plus loin.https://developer.android.com/reference/java/util/concurrent/ExecutorService.html
Lorsque le Gestionnaire est préféré:
Lorsque vous souhaitez mettre à jour les objets de l'INTERFACE utilisateur (comme
TextView
texte) de l'autre thread, il est nécessaire que les objets de l'INTERFACE utilisateur ne pouvait être mis à jour dans le Thread de l'INTERFACE utilisateur.Aussi, quand tu veux juste faire un peu de lumière code plus tard (comme le retard 300ms), vous pouvez utiliser
Handler
parce que c'est plus léger et plus rapide.Veuillez également vous référer à Gestionnaire vs AsyncTask vs Thread
Threads sont génériques de traitement des tâches qui peuvent faire la plupart des choses, mais une chose qu'ils ne peuvent pas faire est de mettre à jour l'INTERFACE utilisateur.
Gestionnaires d'autre part, sont threads d'arrière-plan qui vous permettra de communiquer avec le thread d'INTERFACE utilisateur (mise à jour de l'INTERFACE utilisateur).
Ainsi, par exemple, montrent un toast ou une mise à jour une barre de progression par l'intermédiaire d'un message (Runnable) posté à un gestionnaire, mais vous ne pouvez pas si vous lancez cet exécutable comme un fil.
Avec handler, vous pouvez également avoir des choses comme MessageQueuing, de la planification et de la répétition.
Je suis encore à la rencontre d'une situation où j'avais besoin d'un thread dans android.
J'utilise principalement une combinaison de AsyncTasks et de Gestionnaires.
Des gestionnaires pour les tâches mentionnées ci-dessus.
AsyncTasks pour télécharger/la récupération de données et l'interrogation etc.
Thread
effectivement crée un nouveau thread - cadre de travail en cours d'exécution en arrière-plan relativement au thread courant.Handler
lui-même ne fournit pas de mécanismes pour tâche de fond - c'est juste un outil pour accéder aux messages de la file d'attente (Looper
) associé à du fil. Thread d'INTERFACE utilisateur ontLooper
relié par défaut, de sorte qu'il est de pratique courante de mise à jour de l'INTERFACE utilisateur avecHandler.post(Runable)
qui signifie exécuter un morceau de code sur le thread qui est associé à ceHandler
.Dès que
Handler
sertLooper
, il ne peut pas être créé dans un thread qui n'ont pas d'associéLooper
.