IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Handler vers UI Thread


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Points : 37
    Points
    37
    Par défaut Handler vers UI Thread
    Bonjour à tous,

    voilà je développe une application qui exécute les tâches suivantes:
    - Lancement de l'Activity (UI Thread)
    - Lancement du thread Network
    - Récupération de l'affichage souhaité à l'écran dans le thread Network (appel à un serveur)
    - Transfert de l'interface reçue dans le thread Network vers l' UI Thread
    - Création et affichage de différents éléments.

    Je bloque sur l'avant dernière étape, quand il faut transférer l'interface d'un thread à un autre. Je me suis renseigné au sujet des Handler, Looper et autres joyeusetés, et j'ai compris le principe. Cependant, les exemples que j'ai trouvé déclarent le second thread à l'intérieure de l'activity, ce nouveau thread connait donc le handler qui a été déclaré dans l'Activity.

    Mon problème est que j'ai créé ma propre classe de Thread (nommée TNetwork) pour plus de lisibilité (j'aime pas quand tout se mélange dans le code). Je l'instancie dans mon Activity de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void onCreate(Bundle savedInstanceState) {
     
            super.onCreate(savedInstanceState);
            Looper.prepare();
            Looper.loop();
            mHandler=new MyHandler();
            setContentView(R.layout.main);
     
            if(initDeviceInformations()){          
                threadNetwork=new TNetwork("Network");
                threadNetwork.start();
            }else
            	Log.e("NHDS","Device Initialisation failed");
    }
    Le reste du boulot est fait dans ma classe TNetwork (traitement des trames).
    A partir de là, j'ai créé mon Handler dans mon Activity, afin de récupérer l'interface transmise par le Network Thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public MyHandler mHandler;
    //.....
    class MyHandler extends Handler{
        	@Override
        	public void handleMessage(Message msg){
        		// Traitement
        	}
        };
    Mais quand je veux l'associer dans ma classe TNetwork, impossible, car je n'ai pas de référence vers ce Handler... A savoir que j'aurai probablement plusieurs Handlers de ce genre par la suite allant de Network->UI, et qu'il est difficilement envisageable de les passer tous dans le constructeur du thread Network (ça serait vraiment sale...)

    Y'a-t-il une autre méthode pour récupérer cette fameuse référence?

    Merci d'avance.
    Raz-X

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Il faut que les deux handlers entre ton thread et ton Activity soit le même.

    Pour cela rien de plus simple à toi de créer un getter/setter dans ton thread sur ton handler que tu initialisera via l'handler de ton Activity .

    Tu peux toujours le passer dans le constructeur du thread.

    Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // handler sera celui de ton acticity
    public void onCreate(Bundle savedInstanceState,MyHandler handler) {
     
            super.onCreate(savedInstanceState);
            Looper.prepare();
            Looper.loop();
            mHandler=handler;
            setContentView(R.layout.main);
     
            if(initDeviceInformations()){          
                threadNetwork=new TNetwork("Network");
                threadNetwork.start();
            }else
            	Log.e("NHDS","Device Initialisation failed");
    }
    De là tu pourra envoyer des messages vers ton Activity .

    Tu as un très bon exemple ici :
    http://developer.android.com/resourc...hat/index.html

    Dans le BluetoothService (ton hread) et le BluetoothChat (ton activity) , je crois
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    @Feanorin: J'ai passé le handler dans le constructeur comme tu me l'as indiqué (même si je ne trouve pas ça très joli, mais si c'est la seule solution)

    Et mon handler fonctionne comme prévu.
    Merci beaucoup !

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    J'ai passé le handler dans le constructeur comme tu me l'as indiqué (même si je ne trouve pas ça très joli,
    Euh tu n'es pas obligé de le passer via le constructeur tu peux le faire via un Setter ou une fonction init sur ton handler, mas à toi de bien le définir avant de lancer ton Thread
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Oui tout à fait, mais ça en revient un peu au même ^^
    Finalement la solution de l'initialisation via constructeur me suffira amplement.

    Encore merci.

  6. #6
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Oui tout à fait, mais ça en revient un peu au même ^^
    Yep mais c'était pour éviter le passage par constructeur .
    Si ton problème est résolu n'oublie pas de cliquer sur le bouton .

    Bonne journée
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MVC] Récupérer un resource handler vers un objet depuis un formulaire
    Par Momo-Arusten dans le forum Spring Web
    Réponses: 0
    Dernier message: 25/02/2009, 12h05
  2. [PDE]Rediriger la sortie d'un thread vers une vue Eclipse
    Par Niko31 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/01/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo