Si nous regardons le code source, nous verrons AsyncTask
y Handler
est purement écrit en Java. (Il y a cependant quelques exceptions, mais ce n'est pas un point important).
Donc il n'y a pas de magie dans AsyncTask
o Handler
. Ces classes nous facilitent la vie en tant que développeur.
Par exemple : Si le programme A appelle la méthode A(), la méthode A() pourrait s'exécuter dans un thread différent du programme A. Nous pouvons facilement le vérifier avec le code suivant :
Thread t = Thread.currentThread();
int id = t.getId();
Pourquoi devrions-nous utiliser un nouveau fil de discussion pour certaines tâches ? Vous pouvez le chercher sur Google. Il y a de nombreuses raisons, par exemple : le levage lourd, les travaux de longue haleine.
Alors, quelles sont les différences entre Thread
, AsyncTask
et Handler
?
AsyncTask
y Handler
sont écrites en Java (en interne, elles utilisent un module Thread
), donc tout ce que nous pouvons faire avec Handler
o AsyncTask
nous pouvons réaliser en utilisant un Thread
aussi.
Que peut Handler
y AsyncTask
aide vraiment ?
La raison la plus évidente est la communication entre le thread de l'appelant et le thread du travailleur. ( Fil d'appel : Un thread qui appelle le Fil de travail pour effectuer certaines tâches. Un thread appelant ne doit pas nécessairement être le thread de l'interface utilisateur). Bien sûr, nous pouvons communiquer entre deux threads d'autres manières, mais la sécurité des threads présente de nombreux inconvénients (et dangers).
C'est pourquoi nous devrions utiliser Handler
y AsyncTask
. Ces classes font le gros du travail pour nous, nous devons seulement savoir quelles méthodes surcharger.
La différence entre Handler
y AsyncTask
est : Utilisez AsyncTask
quand Fil conducteur es un Fil conducteur de l'interface utilisateur . C'est ce que dit le document Android :
AsyncTask permet d'utiliser correctement et facilement le thread de l'interface utilisateur. Cette classe permet d'effectuer des opérations en arrière-plan et de publier les résultats sur l'interface utilisateur. sans avoir à manipuler les threads et/ou les handlers.
Je voudrais insister sur deux points :
1) Utilisation facile du thread UI (donc, utilisation lorsque le thread de l'appelant est le thread UI).
2) Pas besoin de manipuler les manipulateurs. (signifie : Vous pouvez utiliser Handler au lieu d'AsyncTask, mais AsyncTask est une option plus facile).
Il y a beaucoup de choses dans ce billet que je n'ai pas encore dites, par exemple : qu'est-ce que UI Thread, ou pourquoi c'est plus facile. Vous devez connaître quelques méthodes derrière chaque classe et l'utiliser, vous comprendrez complètement la raison.
@ : lorsque vous lisez le document Android, vous verrez :
Le gestionnaire vous permet d'envoyer et de traiter les objets Message et Runnable. associés à la MessageQueueue d'un thread.
Cette description peut sembler étrange au premier abord. Il suffit de comprendre que chaque thread dispose d'une file d'attente de messages (comme une liste de tâches), et que le thread prendra chaque message et l'exécutera jusqu'à ce que la file d'attente de messages soit vide (tout comme nous finissons notre travail et allons nous coucher). Ainsi, lorsque Handler
communique, il donne juste un message au thread appelant et il attendra le traitement.
Compliqué ? Rappelez-vous simplement que Handler
peut communiquer avec le thread de l'appelant en toute sécurité.
1 votes
Cela vaut la peine de vérifier : Conférence Douglas Schmidt sur la concurrence et la synchronisation dans Android
10 votes
"Les gestionnaires sont des threads d'arrière-plan" - Certaines des réponses les plus votées semblent également aller dans ce sens. Mais c'est une idée fausse. A
Handler
n'est pas un thread, et il n'exécute rien. Il s'agit uniquement d'un moyen de transmettre en toute sécurité des messages d'un processus à un autre. filetage à la file d'attente des messages d'un autre filetage . Donc, normalement, (au moins) deux fils doivent encore être créés qui peuvent ensuite utiliser un gestionnaire, mais le gestionnaire ne peut rien exécuter lui-même.