396 votes

Exécution du code dans le thread principal à partir d'un autre thread

Dans un service Android, j'ai créé un ou plusieurs threads pour effectuer certaines tâches en arrière-plan.

J'ai une situation où un thread doit poster une certaine tâche sur la file d'attente des messages du thread principal, par exemple un Runnable .

Y a-t-il un moyen d'obtenir Handler du fil de discussion principal et de poster Message / Runnable à partir de mon autre fil ?

2 votes

Vous pouvez également utiliser le récepteur de radiodiffusion personnalisé.... essayer ma réponse ici, [Récepteur de radiodiffusion interne][1] [1] : stackoverflow.com/a/22541324/1881527

0 votes

Il existe de nombreuses façons de le faire. En dehors de la réponse de David et du commentaire de dzeikei dans sa réponse, (3) vous pouvez utiliser un récepteur de diffusion, ou (4) passer le gestionnaire dans les extras de l'Intent utilisé pour démarrer le service, et ensuite récupérer le gestionnaire du thread principal dans le service en utilisant getIntent().getExtras() .

2 votes

@sazzad-hissain-khan, Pourquoi taguer cette question de 2012 avec des réponses majoritairement en Java avec le tag kotlin ?

4voto

HotJard Points 393

Donc le plus pratique est de faire une sorte de.. :

import android.os.AsyncTask
import android.os.Handler
import android.os.Looper

object Dispatch {
    fun asyncOnBackground(call: ()->Unit) {
        AsyncTask.execute {
            call()
        }
    }

    fun asyncOnMain(call: ()->Unit) {
        Handler(Looper.getMainLooper()).post {
            call()
        }
    }
}

Et après :

Dispatch.asyncOnBackground {
    val value = ...// super processing
    Dispatch.asyncOnMain { completion(value)}
}

4voto

Dheeraj V.S. Points 6384

Voici une méthode à laquelle je pense :

1) Laissez l'interface utilisateur se lier au service.
2) Exposer une méthode comme celle ci-dessous par la fonction Binder qui enregistre votre Handler :

public void registerHandler(Handler handler) {
    mHandler = handler;
}

3) Dans le thread de l'interface utilisateur, appelez la méthode ci-dessus après la liaison avec le service :

mBinder.registerHandler(new Handler());

4) Utilisez le gestionnaire dans le fil de discussion du service pour poster votre tâche :

mHandler.post(runnable);

2voto

MarGin Points 568

Suivez cette méthode. En utilisant cette méthode, vous pouvez simplement mettre à jour l'interface utilisateur à partir d'un thread d'arrière-plan. runOnUiThread travaille sur le thread principal (interface utilisateur). Je pense que cet extrait de code est moins complexe et facile, surtout pour les débutants.

AsyncTask.execute(new Runnable() {
            @Override
            public void run() {

            //code you want to run on the background
            someCode();

           //the code you want to run on main thread
 MainActivity.this.runOnUiThread(new Runnable() {

                    public void run() {

/*the code you want to run after the background operation otherwise they will executed earlier and give you an error*/
                        executeAfterOperation();

                   }
                });
            }
        });

dans le cas d'un service

créer un gestionnaire dans le oncreate

 handler = new Handler();

puis l'utiliser comme ceci

 private void runOnUiThread(Runnable runnable) {
        handler.post(runnable);
    }

1voto

Francis Novotný Points 317

Pour Kotlin, vous pouvez utiliser Anko corountines :

mise à jour

doAsync {
   ...
}

déprécié

async(UI) {
    // Code run on UI thread
    // Use ref() instead of this@MyActivity
}

0voto

Revelation A.F Points 1
public void mainWork() {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            //Add Your Code Here
        }
    });
}

Cela peut également fonctionner dans une classe de service sans aucun problème.

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