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 :

Passer des données du threadUI vers un thread de travail


Sujet :

Android

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Passer des données du threadUI vers un thread de travail
    bonjour,
    j'ai besoin de passer des données entre le threadUI (émetteur) et un thread de travail (récepteur).
    Je m'inspire de cet article: http://techtej.blogspot.fr/2011/02/a...ween-main.html
    Mon thread de travail, récepteur de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
            Looper.prepare();
            Handler mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    // Act on the message
                }
            };
            Looper.loop();
     }
    L'article dit: any other thread having the reference to mHandler will be able to call the send or post methods of the Handler class to send a Message (or a runnable object) to our thread.
    Je ne vois pas comment faire pour que le threadUI qui instancie le thread de travail ait une référence sur ce handler qui est instancié dans ce thread de travail justement.

    Merci pour vos avis.

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Je me répond à moi-même:
    j'ai modifié mon code en ajoutant une méthode getHandler() à ma classe clientUdp retournant le handler ouvert par l'objet:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public class ClientUdp extends Thread {
        private int port;
        private String ip_serveur = null;
        private InetAddress serveur = null;
        private DatagramSocket socket = null;
        private Handler mHandler = null;
     
        //constructeur
        public ClientUdp(String addr_ip, int _port) {
            port = _port;
            ip_serveur = addr_ip;
            try {
                serveur = InetAddress.getByName(ip_serveur);
                socket = new DatagramSocket();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
     
        //@Override
        public void run() {
            Looper.prepare();
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    // Act on the message
                    Log.d("handleMessage receive: ", String.valueOf(msg.arg1));
                }
            };
            Looper.loop();
     
        }
     
        public void emet(int val)
        {
            Log.d(new String("emet"), new String("Rien pour le moment"));
        }
     
        public Handler getHandler()
        {
            return mHandler;
        }
    }
    J'y fait appel dans mon activité:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class SliderCmde extends AppCompatActivity {
        public int curseur_value = 0;
        ClientUdp client = null;
        private final Message msg = Message.obtain();
        private Handler WorkingThreadHandler = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_slider_cmde);
    
            //démarrer le client UDP
            client = new ClientUdp("192.168.0.18", 4950);
            client.start();     //démarre le thread et donc son handler
            if(client.isAlive())
                Log.d("Workin thread", " living");
    
            WorkingThreadHandler = client.getHandler();
            if(WorkingThreadHandler == null)
            {
                int duration = Toast.LENGTH_LONG;
                Toast toast = Toast.makeText(getApplicationContext(), "WorkingThreadHandler is null", duration);
                toast.setGravity(Gravity.TOP| Gravity.LEFT, 150, 220);
                toast.show();
            }
    
            msg.obj =  75;  // Some Arbitrary object
            //pour test, fait planter l'appli  WorkingThreadHandler.sendMessage(msg);
    
            final TextView tv = (TextView) findViewById(R.id.textView_afficheur);
            SeekBar curseur = (SeekBar) findViewById(R.id.seekBar);
            curseur.setMax(255);
            curseur.setProgress(0);
            curseur_value = curseur.getProgress();
            tv.setText(String.valueOf(curseur_value));
    
            //Gestion de l'évènement SeekBarChanged
            curseur.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
                public void onProgressChanged (SeekBar curseur, int progress, boolean fromUser) {
                    tv.setText(String.valueOf(progress));
                    msg.arg1 =  progress; // Some Arbitrary object
                    //mHandler.sendMessage(msg);
                }
                public void onStartTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub
                }
                public void onStopTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub
                }
            });
        }
    }
    Le toast affiche que le Handler WorkingThreadHandler est toujours de valeur null comme s'il n'avait pas été instancié dans la méthode run() du thread.
    Je reprend mes investigations...

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonjour,
    un petit sleep() après l'appel à getHandler() et ça fonctionne.
    C'est un peu pifométrique et ce n'est sûrement pas la meilleure manière de faire mais pour l'instant, ça répond à ce qui est demandé.

    Merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/02/2012, 09h56
  2. [XL-2007] VBA problème pour passer des données EXCEL vers WORD
    Par nocontrol dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/07/2011, 10h01
  3. Réponses: 5
    Dernier message: 03/02/2010, 01h14
  4. [VB6] passer des données de VB vers un fichier Word
    Par Eba chan dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/01/2006, 17h55
  5. [CR7][VB6] Passer des infos de Vb vers CR
    Par tripper.dim dans le forum SDK
    Réponses: 2
    Dernier message: 13/11/2003, 13h30

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