3 votes

Différence entre Handler et Threads dans Android et les Handlers créent-ils des threads séparés ?

J'ai lu de nombreuses questions concernant ce sujet, mais je n'ai trouvé aucune réponse directe qui puisse répondre à ma question très simple : Les handlers créent-ils réellement de nouveaux threads ou créent-ils simplement un handler pour le même thread que celui à partir duquel ils ont été créés ? Dans la documentation d'Android, ils sont mentionnés :

"Chaque instance de Handler est associée à un seul thread et à la file d'attente de messages de ce thread. Lorsque vous créez un nouveau Handler, il est lié au thread / à la file d'attente de messages du thread qui le crée -- à partir de ce moment, il délivrera des messages et des runnables à cette file d'attente de messages et les exécutera au fur et à mesure qu'ils sortiront de la file d'attente de messages."

Et puis ils mentionnent aussi sur la même page :

"Il y a deux utilisations principales pour un Handler : (1) pour planifier des messages et des runnables à exécuter à un moment donné dans le futur ; et (2) pour mettre en file d'attente une action à exécuter sur un thread différent du vôtre".

Je ne sais pas s'ils veulent dire que le Handler crée réellement de nouveaux threads qui peuvent communiquer avec le thread à partir duquel ils ont été créés (par exemple, à partir du thread UI) OU qu'ils permettent à différents threads de communiquer avec le thread UI si le Handler a été créé à partir du thread UI ?

Par exemple, dans ma MainActivity et dans la fonction onCreate(), je fais ceci :

public class MainActivity extends ActionBarActivity {

    private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();
    private Handler mHandler;
    private Runnable mRunnable = new Runnable() {
        public void run() {
            // do something
            processData();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");

        mHandler = new Handler();
        mHandler.post(mRunnable);

        .....

Suis-je en train de créer un nouveau thread ici, indépendant du thread de l'interface utilisateur, qui exécutera la fonction (processData) ? Si je ne crée pas un nouveau thread, quelle serait alors la différence entre mon code ci-dessus et le simple appel de la fonction (processData) sans avoir besoin de créer un gestionnaire, comme suit :

public class MainActivity extends ActionBarActivity {

    private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
        processData();

        .....

Merci beaucoup.

Anmar

0voto

Mina Samy Points 3207

La réponse à la question

"Suis-je en train de créer un nouveau thread ici, indépendant de celui de l'interface utilisateur ? qui exécutera la fonction (processData) ? Si je ne crée pas un nouveau thread, quelle serait alors la différence entre mon code ci-dessus et le simple fait d'appeler la fonction (processData) sans avoir besoin de créer un gestionnaire ? handler" ?

est non, afficher le runnable ne signifie pas créer un thread et exécuter le runnable en arrière-plan.

la différence entre l'envoi d'un runnable et l'appel d'une fonction : théoriquement, l'envoi d'un runnable l'ajoute à la file d'attente des messages pour être traité lorsque la file d'attente des messages est prête à le faire, alors que l'appel de la fonction s'exécute immédiatement, mais globalement, les deux sont similaires.

la file d'attente de messages, comme son nom l'indique, traite les exécutables postés par un gestionnaire de manière FIFO (first in, first out).

peuvent être utilisés avec Threads pour transmettre les mises à jour des threads d'arrière-plan au thread de l'interface utilisateur.

Voici un vieux post que j'ai écrit sur l'utilisation des handlers : http://Android-pro.blogspot.com.eg/2011/05/threading-in-Android-part-1-handlers.html

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