Aller au contenu

[RESOLU] utiliser des Async Task


Morgan26

Recommended Posts

Bonjour,

Comme on me l'a demande je repost donc mon probleme dans ce topic : Il s'agit de reussir a utiliser un async Task dnas mon activity principal afin de supprimer le temps d'attente en effet je doit me connecter a un site web et recuperer des donnes. Voici tout d'abord le code qui marche sans utilisation d'asyncTask:

package com.Sportandlive;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;



public class Sportandlive extends Activity implements OnClickListener {

   Button connection = null;

   public static final int CODE_RETOUR = 0;

   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   connection = (Button)findViewById(R.id.connection);
   // On spécifie que le le listener est notre classe
   connection.setOnClickListener(this);


   }

   @Override
   public void onClick(View v) {
       final EditText email = (EditText)findViewById(R.id.email);
       final EditText password = (EditText)findViewById(R.id.password);

   // Vérification de la vue cliquée

   if (v == connection) {
       if(email.getText().length() > 0) {
           if(password.getText().length() > 0) {

               HttpPost httppost = new HttpPost("http://dev-sportandlive.ialw.net/webservice/connect");

               List nameValuePairs = new ArrayList(); //On crée la liste qui contiendra tous nos paramètres

               //Et on y rajoute nos paramétres

               String md5Email = new Md5Convert().encode(email.getText().toString());


               nameValuePairs.add(new BasicNameValuePair("email", md5Email));
               nameValuePairs.add(new BasicNameValuePair("mdp", password.getText().toString()));

               //On lie la liste a l'instante httpPost
               try {
                   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                   //ON envoie
                   HttpClient httpclient = new DefaultHttpClient();
                   //ON recupere la reponse
                   HttpResponse response;
                   try {
                       response = httpclient.execute(httppost);
                       //ON stocke la reponse
                       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                       String s = reader.readLine();
                       Toast.makeText(Sportandlive.this, s, Toast.LENGTH_SHORT).show();
                       if (!(s.equals("false")))
                       {
                           Toast.makeText(Sportandlive.this, "fin", Toast.LENGTH_SHORT).show();

/*                            Intent monIntent = new Intent(this,Actu.class);
                           startActivity(monIntent);*/
                       }

                   } catch (ClientProtocolException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }

               } catch (UnsupportedEncodingException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }


           }
       }

   }
   }

   }

Et maintenant le code avec AsyncTask mais qui malheureusement ne marche pas ..:

package com.Sportandlive;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;



public class Sportandlive extends Activity implements OnClickListener {

   Button connection = null;



   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   connection = (Button)findViewById(R.id.connection);
   // On spécifie que le le listener est notre classe
   connection.setOnClickListener(this);


   }


    private class DownloadFilesTask extends AsyncTask {
        String s;
        protected Long doInBackground() {
            HttpPost httppost = new HttpPost("http://dev-sportandlive.ialw.net/webservice/connect");

               List nameValuePairs = new ArrayList(); //On crée la liste qui contiendra tous nos paramètres

               //Et on y rajoute nos paramétres

               String md5Email = new Md5Convert().encode("coucou");


               nameValuePairs.add(new BasicNameValuePair("email", md5Email));
               nameValuePairs.add(new BasicNameValuePair("mdp", "b"));

               //On lie la liste a l'instante httpPost
               try {
                   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                   //ON envoie
                   HttpClient httpclient = new DefaultHttpClient();
                   //ON recupere la reponse
                   HttpResponse response;
                   try {
                       response = httpclient.execute(httppost);
                       //ON stocke la reponse
                       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                        s = reader.readLine();


                   } catch (ClientProtocolException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }

               } catch (UnsupportedEncodingException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
            return null;
        }

        protected void onPostExecute() {
               if (!(s.equals("false")))
               {
               Toast.makeText(Sportandlive.this, s, Toast.LENGTH_SHORT).show();
               Intent monIntent = new Intent(Sportandlive.this,Actu.class);
               startActivity(monIntent);
               }

        }


       @Override
       protected Object doInBackground(Object... params) {
           // TODO Auto-generated method stub
           return null;
       }
    }

   @Override
   public void onClick(View v) {
       final EditText email = (EditText)findViewById(R.id.email);
       final EditText password = (EditText)findViewById(R.id.password);

   // Vérification de la vue cliquée

   if (v == connection) {
       if(email.getText().length() > 0) {
           if(password.getText().length() > 0) {

                new DownloadFilesTask().execute();

           }
       }

   }
   }


   }

Alors si quelqu'un comprends pourquoi ce code ne marche pas , et qu'il veut bien m'expliquer, ce serrait sympa ! Merci!!

Modifié par Morgan26
Lien vers le commentaire
Partager sur d’autres sites

Si tu codes ton traitement dans une méthode doInBackground que tu inventes toi-même, il ne risque pas de s'exécuter. Tu es senser réaliser le traitement dans la méthode doInBackground(...) qui est surchargée (celle avec le @Override avant) et dans lequel tu ne fais rien... enfin si, tu retournes null :)

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Ha oui en effet :) Merci de ton aide ! Bon j'ai refait quelque test, cette fois ci mon traitement marche sur eclipse : [color=red][b]sa[/b][/color] m'affiche la premiere ligne que l'url doit me renvoyer, seulement quand j'essaye sur mon N1 je rentre les meme parametres mais cette fois, au lieu de planter (comme avant sans l'utilisation de asyncTask) Il ne fait rien du tout et ne m'affiche meme pas le retour de mon url ... Voici le code de l'Asynctask, le reste n'ayant pratiquement pas change :

     private class DownloadFilesTask extends AsyncTask {
        String s;

           @Override
           protected String doInBackground(String... params) {
            HttpPost httppost = new HttpPost("http://dev-sportandlive.ialw.net/webservice/connect");

               List nameValuePairs = new ArrayList(); //On crée la liste qui contiendra tous nos paramètres

               //Et on y rajoute nos paramétres

               String md5Email = new Md5Convert().encode(params[0]);

               nameValuePairs.add(new BasicNameValuePair("email", md5Email));
               nameValuePairs.add(new BasicNameValuePair("mdp", params[1]));

               //On lie la liste a l'instante httpPost
               try {
                   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                   //ON envoie
                   HttpClient httpclient = new DefaultHttpClient();
                   //ON recupere la reponse
                   HttpResponse response;
                   try {
                       response = httpclient.execute(httppost);
                       //ON stocke la reponse
                       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                        s = reader.readLine();

                   } catch (ClientProtocolException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }

               } catch (UnsupportedEncodingException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
            return s;
        }

        protected void onPostExecute(String s) {
               Toast.makeText(Sportandlive.this, s, Toast.LENGTH_SHORT).show();
           /*    Intent monIntent = new Intent(Sportandlive.this,Actu.class);
               startActivity(monIntent);
            */
        }

    }

Lien vers le commentaire
Partager sur d’autres sites

ok j'essaye

Bon alors deja pour mes log j'obtient ca :

09-10 08:09:11.022: DEBUG/dalvikvm(127): GC_EXTERNAL_ALLOC freed 2605 objects / 138664 bytes in 81ms
09-10 08:09:43.462: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.Sportandlive/.Sportandlive }
09-10 08:09:44.091: INFO/ActivityManager(59): Displayed activity com.Sportandlive/.Sportandlive: 518 ms (total 518 ms)
09-10 08:09:49.622: DEBUG/dalvikvm(127): GC_EXPLICIT freed 607 objects / 39280 bytes in 194ms
09-10 08:09:50.651: DEBUG/dalvikvm(120): GC_FOR_MALLOC freed 1583 objects / 216264 bytes in 106ms
09-10 08:09:51.631: WARN/KeyCharacterMap(120): No keyboard for id 0
09-10 08:09:51.631: WARN/KeyCharacterMap(120): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
09-10 08:09:51.881: DEBUG/dalvikvm(120): GC_EXTERNAL_ALLOC freed 1984 objects / 135320 bytes in 90ms
09-10 08:09:52.202: WARN/KeyCharacterMap(120): No keyboard for id 0
09-10 08:09:52.202: WARN/KeyCharacterMap(120): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
09-10 08:10:00.172: DEBUG/dalvikvm(275): GC_FOR_MALLOC freed 3497 objects / 166984 bytes in 142ms
09-10 08:10:00.541: INFO/global(275): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.

par contre je n'arrive pas a faire le mod debug pas a pas .. je vais dans debugg puis je fais F6 mais rien ne se passe.

Modifié par Morgan26
Lien vers le commentaire
Partager sur d’autres sites

je fais click droit et tooggle breakpoint au niveau de la declaration de mon activity principale , [color=red][b]sa[/b][/color] m'affiche un C vert dans la marge a gauche. C'a m'a fait un point d'arret ca ? parce que quand je run je ne voit pas de differance

EDIT : Ha c'est bon j'ai trouve j'essaye

RE EDIT : bon donc il semblerait quand je run mon appli en debug qu'a aucun moment mon AsyncTask arrete de tourner : dans mon debug ca me fait

Thread[<8> AsyncTask #1](Running)

puis si je ressaye d'appuyer sur mon bouton ca me fait :

Thread[<9> AsyncTask #2](Running)

et le premier est toujour en running ...

Ca viendrait donc du fait que mon Async Task ne se termine pas ?

Modifié par Morgan26
Lien vers le commentaire
Partager sur d’autres sites

Non ça c'est ce qui tourne dans ton appli (si on parle de la même chose)

Double-click dans la marche à gauche de :

HttpPost httppost = new HttpPost("http://dev-sportandlive.ialw.net/webservice/connect");

Ca va te créer un BReakpoint (un point vert)

Ensuite tu lances ton appli en mode debug (l'insecte vert en haut) et tu attends, l'exécution devrait se bloquer à la ligne du Breakpoint

Si c'est le cas, tu peux ensuite continuer l'exécution pas à pas en appuyant sur F6 et voir où elle passe

Lien vers le commentaire
Partager sur d’autres sites

OK c'est bon j'ai reussis a faire correctement le debug, dans l'onglet debug j'ai cela qui s'est affiche :

Sportandlive [Android Application]    
   DalvikVM[localhost:8662]    
       Thread [<1> main] (Running)    
       Thread [<6> Binder Thread #2] (Running)    
       Thread [<5> Binder Thread #1] (Running)    
       Thread [<7> Binder Thread #3] (Running)    
       Thread [<8> AsyncTask #1] (Suspended (breakpoint at line 54 in Sportandlive$DownloadFilesTask))    
           Sportandlive$DownloadFilesTask.doInBackground(String...) line: 54    
           Sportandlive$DownloadFilesTask.doInBackground(Object...) line: 1    
           AsyncTask$2.call() line: 185    
           FutureTask$Sync.innerRun() line: 305    
           AsyncTask$3(FutureTask).run() line: 137    
           ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1068    
           ThreadPoolExecutor$Worker.run() line: 561    
           Thread.run() line: 1096    

Et voila les variables que cela me genere dans l'onglet variables ( en enchainant plusieur fois F6) :

this    Sportandlive$DownloadFilesTask  (id=830067860032)    
   mFuture    AsyncTask$3  (id=830067860064)    
   mStatus    AsyncTask$Status  (id=830067781648)    
   mWorker    AsyncTask$2  (id=830067695808)    
   s    null    
   this$0    Sportandlive  (id=830067688504)    
params    String[2]  (id=830067705184)    
   [0]    "tes" (id=830067705248)    
   [1]    "cou" (id=830067705344)    
httppost    HttpPost  (id=830067711080)    
   aborted    false    
   abortLock    ReentrantLock  (id=830067702096)    
   connRequest    null    
   entity    UrlEncodedFormEntity  (id=830068102264)    
   headergroup    HeaderGroup  (id=830067707736)    
   params    null    
   releaseTrigger    null    
   uri    URI  (id=830067711272)    
nameValuePairs    ArrayList  (id=830067755648)    
md5Email    "28b662d883b6d76fd96e4ddc5e9ba780" (id=830067806344)    
   count    32    
   hashCode    0    
   offset    0    
   value     (id=830067806032)    

Modifié par Morgan26
Lien vers le commentaire
Partager sur d’autres sites

Ha ha !! J'ai trouve ou se situe le probleme ! J'ai tout simplement mis en commentaire tout ce que j'ai dans mon doInBackground et du coup quand je rentre dedans, sa quitte direct en me faisant un toast . Sa marche sur Eclipse ET sur mon telephone. Donc je pense que le probleme vient du fait que mon tel n'aime pas le HttpPost .. Tu saurais a quoi cela peut etre due ?

Par exemple peut etre qu'il faut modifier des parametres pour que mon tel se connecte a internet ..

Plus particulièrement, c'est cette ligne :

response = httpclient.execute(httppost);

qui fait planter mon tel

Yahouuuuuuuuu !! SA marche !!! J'ai trouve ma solution ici :

http://stackoverflow.com/questions/3046424/http-post-requests-using-httpclient-take-2-seconds-why

Modifié par Morgan26
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...