96 votes

Accès au gestionnaire de threads de l'interface utilisateur à partir d'un service

Je suis en train d'essayer quelque chose de nouveau sur Android pour lequel j'ai besoin d'accéder au gestionnaire du thread de l'interface utilisateur.

Je sais ce qui suit :

  1. Le thread UI a son propre gestionnaire et de boucles
  2. Tout message sera placé dans la file d'attente des messages de l'interface utilisateur
  3. Le looper récupère l'événement et le transmet au gestionnaire
  4. Le gestionnaire traite le message et envoie l'événement spécifique à l'interface utilisateur.

Je veux avoir mon service qui doit obtenir le gestionnaire de fil de l'interface utilisateur et mettre un message dans ce gestionnaire. Ainsi, ce message sera traité et sera envoyé à l'interface utilisateur. Ici, le service sera un service normal qui sera lancé par une application.

J'aimerais savoir si cela est possible. Dans l'affirmative, veuillez me suggérer quelques extraits de code pour que je puisse l'essayer.

Salutations Girish

1voto

Zohab Ali Points 1028

Sur kotlin c'est comme ça que vous pouvez le faire

Disons que vous voulez montrer le message Toast du service.

val handler = Handler(Looper.getMainLooper())
handler.post {
   Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show()
}

0voto

Ravindra babu Points 5571

Solution :

  1. Créer un Manipulateur con Looper de Main Thread : requestHandler
  2. Créer un Handler con Looper à partir du fil principal : responseHandler et surcharger handleMessage méthode
  3. poster un Runnable tâche sur requestHandler
  4. À l'intérieur de Runnable tâche, appeler sendMessage sur responseHandler
  5. Ce site sendMessage résultat de l'invocation de handleMessage dans responseHandler.
  6. Obtenir les attributs de la Message et le traiter, mettre à jour l'interface utilisateur

Exemple de code :

    /* Handler from UI Thread to send request */

    Handler requestHandler = new Handler(Looper.getMainLooper());

     /* Handler from UI Thread to process messages */

    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {

            /* Processing handleMessage */

            Toast.makeText(MainActivity.this,
                    "Runnable completed with result:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

    for ( int i=0; i<10; i++) {
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                   /* Send an Event to UI Thread through message. 
                      Add business logic and prepare message by 
                      replacing example code */

                    String text = "" + (++rId);
                    Message msg = new Message();

                    msg.obj = text.toString();
                    responseHandler.sendMessage(msg);
                    System.out.println(text.toString());

                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        };
        requestHandler.post(myRunnable);
    }

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