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 ?

29voto

Alexander Volkov Points 241

Si vous exécutez du code dans un thread, par exemple pour retarder une action, vous devez invoquer l'option runOnUiThread du contexte. Par exemple, si votre code se trouve dans MainActivity puis utilisez ceci :

MainActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        myAction();
    }
});

Si votre méthode peut être invoquée soit à partir de main (UI thread), soit à partir d'autres threads, vous avez besoin d'une vérification comme celle-ci :

public void myMethod() {
   if( Looper.myLooper() == Looper.getMainLooper() ) {
       myAction();
   }
   else {

}

7 votes

L'OP dit qu'il fait tourner les fils dans un Service . Vous ne pouvez pas utiliser runOnUiThread() dans un Service .

0 votes

@DavidWasser Est-ce que cela est documenté quelque part ? La documentation de la méthode ne mentionne rien à ce sujet. developer.Android.com/reference/Android/app/

1 votes

@GregBrown Comme vous l'avez indiqué par votre lien avec le Activity documentation, runOnUiThread() est une méthode de Activity . Il ne s'agit pas d'une méthode de Service et vous ne pouvez donc pas l'utiliser. Qu'est-ce qui pourrait être plus clair que cela ?

8voto

mevdev Points 421

Je sais qu'il s'agit d'une vieille question, mais je suis tombé sur un one-liner de fil principal que j'utilise à la fois en Kotlin et en Java. Ce n'est peut-être pas la meilleure solution pour un service, mais pour appeler quelque chose qui va changer l'interface utilisateur à l'intérieur d'un fragment, c'est extrêmement simple et évident.

Java (8) :

 getActivity().runOnUiThread(()->{
      //your main thread code
 });

Kotlin :

this.runOnUiThread {
     //your main thread code
}

6voto

Inn0vative1 Points 346

Le moyen le plus simple, surtout si vous n'avez pas de contexte, si vous utilisez RxAndroid, vous pouvez le faire :

AndroidSchedulers.mainThread().scheduleDirect {
    runCodeHere()
}

5voto

Hamed Jaliliani Points 452

Un code Kotlin plus précis grâce au handler :

Handler(Looper.getMainLooper()).post {  
 // your codes here run on main Thread
 }

5voto

philoopher97 Points 346
ContextCompat.getMainExecutor(context).execute {
  // do something
}

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