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 :

Enchainement de N AsyncTask


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut Enchainement de N AsyncTask
    Bonjour,
    Je dois réaliser N appels successifs (par exemple 10) à un module connecté Wifi. Il s'agit d'envoyer une commande et à attendre le résultat dont le temps de réponse est indéterminé dans un intervalle de temps maximal.
    J’ai donc créé une AsyncTask qui intègre une socket TCP client. Je déclenche une mesure par un événement bouton. Cà fonctionne.
    Maintenant comment faire pour lancer N mesures à partir d’un bouton, en ne bloquant pas tout le système.
    J’ai essayé d’attendre le status de l'AsyncTask FINISHED pour synchroniser la mesure suivante, mais ça bloque l’application.
    Mon code (f_serie_10() est la fonction déclenchée par le bouton) :
    Merci pour votre aide.
    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
     
    void f_serie_10() {
            int i,k=0;
            Tcp_com Tcp;
            Tcp = new Tcp_com();
            for (i=1;i<=10;i++) {
                status.setText("Essai: " + i);
                if (cible_free) Tcp.execute("TEST_COM");                        // lance mesure
                try {Thread.sleep(500);} catch (InterruptedException e) {};      // tempo 500 ms
                while (Tcp.getStatus() != AsyncTask.Status.FINISHED) {          // attend réponse cible
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) { }
                    k++;
                    status.setText("Tempo: " + k);
                }
                text_score.setText("Tir: "+i+" "+srec);        }
        }

  2. #2
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Je suppose que c'est Tcp_com() ton objet AsyncTask. Il est impossible d'invoquer 10 fois de suite execute() sur une même instance. Il faut creer 10 instances différentes.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Merci pour la réponse.
    Ok pour le fait que l'on ne peut lancer N fois "execute" sur la même instance.
    Mon problème vient du fait que quand je fais une attente en testant le status de l'AsyncTask, elle est toujours en RUNNING.
    Je l'ai suivi avec le debugger, en mettant un point d'arrêt sur le return de la fonction "doInBackground".
    La fonction "onPostExecute" s'exécute correctement, mais une chose curieuse, lorsque je continue au debugger pas à pas , le programme entre de nouveau dans le run de la classe AsyncTask .
    Et le debugger m'affiche que l'AsyncTask est toujours RUNNING, ce qui explique le blocage du while.
    Est ce le fonctionnement normal ?

    Mon code:

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     void f_serie_10() {
            if (!cible_free) return;
            Tcp_com tcp1;                                                     // mon AsyncTask
            tcp1=new Tcp_com();
            if (cible_free) tcp1.execute("TEST_COM");                         // lance mesure
            try {Thread.sleep(1000);} catch (InterruptedException e) {};      // tempo 1000 ms pour le lancement de tcp1
     
     
            while (tcp1.getStatus() != AsyncTask.Status.FINISHED)                 // attend réponse cible en interrogeant le status de tcp1
                {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) { }
                }
     
     
        }
     
        void tempo (int x) { try {Thread.sleep(x);} catch (InterruptedException e) {}}
        private static final int SERVER_PORT = 1336;
        private static final String IP_SERVER = "192.168.4.1";
     
    ////////////////////////////////////////////////////////////////////////////////////////////////////
                                                                    // Méthode TCP client
        private class Tcp_com extends AsyncTask<String, Void, String> {
     
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                status.setText("OnPreExecute !");
                cible_free = false;
            }
     
            @Override
            protected String doInBackground(String... params) {
                String sr = "Nothing;";
                String tcpMsg = params[0];
                try {
                    Socket s = new Socket(IP_SERVER, SERVER_PORT);
                    DataOutputStream outToServer = new DataOutputStream(s.getOutputStream());
                    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
     
                    tempo(500);                         // envoie commande
                    outToServer.writeBytes(tcpMsg);
     
                    tempo(500);                         // réception
                    sr = inFromServer.readLine();       // ligne vide
                    sr = inFromServer.readLine();       // le résultat
     
                    tempo(1000);                         //close connection
                    s.close();
                    inFromServer.close();
                    outToServer.close();
     
                }
                catch (UnknownHostException e) {}
                catch (IOException e) {}
     
                return "TCP2 " + sr;      // fin de doInBackground retourne la réponse du serveur
            }
     
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                srec = result;
                status.setText(srec);
                String[] parts = srec.split(";");
                String part2 = parts[2];
                text_score.setText(part2);
                status.setText(srec);
                cible_free = true;
            }
     
        }

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pas convaincu que l'asynctask soit adaptée dans ton cas.

    A mon avis un thread et un handler son plus adapté à ton problème :

    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
    Handler handler = new Handler() {
    	@Override
    	public void handleMessage(Message msg) {
    		TextView textView = (TextView)findViewById(R.id.textView);
    		myTextView.setText("Message recu du thread");
    	}
    };
     
    public void run() {
     
    	for (i=1;i<=10;i++) {
    		//Ton code
    		handler.sendEmptyMessage(0); // Notifie le handler
    	}
    };
     
    Thread mythread = new Thread(runnable);
    mythread.start();
    Pour la simplicité de l'exemple j'envoi un message vide mais on peut bien sur y ajouter des données , les envoyer à retardement , etc ...
    http://developer.android.com/referen...s/Handler.html
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Ok, je vais potasser les threads handler et compagnie.

  6. #6
    Expert confirmé

    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
    Par défaut
    Même je peux pousser le bouchon un peu plus loin en de disant que les IntentService sont fait pour toi.

    http://developer.android.com/referen...ntService.html

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

Discussions similaires

  1. Enchainement images et click
    Par TieumB dans le forum Windows
    Réponses: 3
    Dernier message: 02/02/2005, 10h55
  2. [ADO] enchainer deux TADOQuery
    Par cdlr27 dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/12/2004, 10h36
  3. Enchainer des fonctions dans un onclick d'un bouton
    Par jpg dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2004, 16h51
  4. [IHM] Enchainement des écrans
    Par CanardJM dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/06/2004, 16h01
  5. MSXML2, enchainer deux feuilles de Style
    Par burno dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/09/2003, 13h47

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