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

Composants graphiques Android Discussion :

ListView JSON et Asynctask


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Par défaut ListView JSON et Asynctask
    Bonjour,

    Je développe une application qui récupère des données via JSON.

    J'ai réussi à afficher ces données dans une application toute simple qui ne gère que ça. Mais intégrer à ma "principale" application, j'obtiens l'erreur suivante :
    Error in http connexion android.os.NetworkOnMainThreadException
    J'ai trouvé sur internet qu'il faut créer un thread ou une asynctask pour ne pas utiliser le "main thread" de l'application ou quelque chose dans cet esprit la...

    Malgré tous les exemples que j'ai pu étudier, je n'arrive pas à savoir par où commencer.

    Voici 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
    76
    77
    78
    79
    80
    public class ListeProduits extends Activity {
     
    	TextView txt;
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.liste_produits);
     
    		LinearLayout rootLayout = new LinearLayout(getApplicationContext());  
    		txt = new TextView(getApplicationContext());  
    		rootLayout.addView(txt);  
    		setContentView(rootLayout);  
     
    		// Définir le texte et appeler la fonction de connexion.  
    		txt.setText("Connexion..."); 
    		// Appeler la méthode pour récupérer les données JSON
    		txt.setText(getServerData(strURL)); 
    	}
     
    	// Mettre l'adresse du script PHP
    	// Attention localhost ou 127.0.0.1 ne fonctionnent pas. Mettre l'adresse IP local.
    	public static final String strURL = "http://xxxx.free.fr/xxx.php";
     
    	private String getServerData(String returnString) {
    		InputStream is = null;
    		String result = "";
    		// Envoyer la requête au script PHP.
    		// Script PHP : $sql=mysql_query("select * from tblVille where Nom_ville like '".$_REQUEST['ville']."%'");
    		// $_REQUEST['ville'] sera remplacé par L dans notre exemple.
    		// Ce qui veut dire que la requête enverra les villes commençant par la lettre L
    		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		nameValuePairs.add(new BasicNameValuePair("Nom", "L"));
     
    		// Envoie de la commande http
    		try{
    			HttpClient httpclient = new DefaultHttpClient();
    			HttpPost httppost = new HttpPost(strURL);
    			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    			HttpResponse response = httpclient.execute(httppost);
    			HttpEntity entity = response.getEntity();
    			is = entity.getContent();
     
    		}catch(Exception e){
    			Log.e("log_tag", "Error in http connection " + e.toString());
    		}
     
    		// Convertion de la requête en string
    		try{
    			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
    			//"iso-8859-1"
    			StringBuilder sb = new StringBuilder();
    			String line = null;
    			while ((line = reader.readLine()) != null) {
    				sb.append(line + "\n");
    			}
    			is.close();
    			result=sb.toString();
    		}catch(Exception e){
    			Log.e("log_tag", "Error converting result " + e.toString());
    		}
    		// Parse les données JSON
    		try{
     
    			JSONArray jArray = new JSONArray(result);
    			for(int i=0;i<jArray.length();i++){
    				JSONObject json_data = jArray.getJSONObject(i);
    				// Affichage Produit et Prix dans le LogCat
    				Log.i("log_tag","Produit: "+json_data.getString("Produit")+
    						", Prix: "+json_data.getInt("Prix")
    				);
     
    				// Résultats de la requête
    				returnString += "\n\t" + jArray.getJSONObject(i); 
    			}
    		}catch(JSONException e){
    			Log.e("log_tag", "Error parsing data " + e.toString());
    		}
    		return returnString; 
    	}
    }
    Un petit coup de pouce ne serait pas de refus ^^

    Merci de l'attention que vous accorderez à mon problème

    GJuubz

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Oui le code est déjà montré à plusieurs reprises dans les divers tutoriels de developpez.com...

    Dans ton cas:
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    public class ListeProduits extends Activity {
     
    	TextView txt;
     
     
    	// Mettre l'adresse du script PHP
    	// Attention localhost ou 127.0.0.1 ne fonctionnent pas. Mettre l'adresse IP local.
    	private static final String DATA_URL = "http://xxxx.free.fr/xxx.php";
     
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.liste_produits);
     
                    /* C'est quoi l'interêt de tout ce truc ?  tout devrait être dans R.lyaout.liste_produits.  D'autant que getApplicationContext() devrait être simplement "this"
    		LinearLayout rootLayout = new LinearLayout(getApplicationContext());  
    		txt = new TextView(getApplicationContext());  
    		rootLayout.addView(txt);  
    		setContentView(rootLayout);
     
                    à remplacer donc par:
                    */
                    this.txt = (TextView) findViewById(R.id.text);
     
    		// Ici on démarre la tâche... (sinon le setText avant n'a aucun interêt, il ne sera jamais affiché !)
                    GetServerDataTask task = new GetServerDataTask();
                    task.execute(DATA_URL);
    	}
     
     
            /**
             * La tâche prend en entrée un "String", en sortie un "JSONArray", et on se fiche du progress, donc Void au milieu */
    	class GetServerDataTask extends AsyncTask<String,Void,JSONArray> {
     
     
                /** Appelée dans le thread principal (on a donc le droit de toucher à l'UI) avant le démarrage */
                public void onPreExecute()
                {
                       /** Ici on indique qu'on charge */
      		   txt.setText("Connexion..."); 
                }
     
                /** Appelée dans un thread à part, recoit les mêmes paramètres que ceux passés à "execute()" */
                public void doInBackground(String ... urls)
                {
    		// Envoie de la commande http
    		try{
     		        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		        nameValuePairs.add(new BasicNameValuePair("Nom", "L"));
     
    			HttpClient httpclient = new DefaultHttpClient();
    			HttpPost httppost = new HttpPost(strURL);
    			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     
    			HttpResponse response = httpclient.execute(httppost);
    			HttpEntity entity = response.getEntity();
     
                            String entityStr = EntityUtils.toString(entity);
     
                            return new JSONArray(entityStr);
     
    		}catch(Exception e){
    			Log.e("GetServerDataTask", "Erreur de récupération des données",e);
    		}
                    return null;
                }
     
                /**
                 * Appelé dans le thread UI, avec le retour de doInBackground. On peut donc modifier l'UI ici.
                 */
                public void onPostExecute(JSONArray result)
                {
    		 if (result != null) {
                             for(int i=0;i<result.length();i++){
    				JSONObject json_data = result.getJSONObject(i);
    				// Affichage Produit et Prix dans le LogCat
    				Log.i("GetServerDataTask","Produit: "+json_data.getString("Produit")+
    						", Prix: "+json_data.getInt("Prix")
    				);
     
    				// AUCUNE IDEE DE CE QUE TU VEUX FAIRE ICI !!
                                    // Tout mettre dans une string ? (utiliser StringBuilder dans ce cas)
    				returnString += "\n\t" + jArray.getJSONObject(i); 
    			}
                     } else
                         txt.setText("Erreur !");
                     }
                }
          }
    }
    Les remarques associées:
    1. Les appels à Log doivent avoir un "tag" cohérent qui veut dire quelque chose... "log_tag" ne l'est pas, le nom de la classe déjà plus.
    2. Dans le cas des appels à Log avec une exception, il faut passer l'exception en 3eme paramètre sinon, perte de la stack, ce qui est dommage quand même !
    3. Utiliser EntityUtils.toString() au lieu de tout un mic-mac avec des InputStream (pas libérés correctement en prime).

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Par défaut
    Merci pour ce code, mais maintenant j'ai un problème dans le sens inverse, c'est à dire insérer des données dans ma base de données à partir des informations rentrées par l'utilisateur.

    Code JAVA : (J'appelle GetServerDataTask task = new GetServerDataTask();
    task.execute(URL2); sur un clickListener)

    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
    class GetServerDataTask extends AsyncTask<String,String,JSONArray> {
     
    	private ProgressDialog pDialog;
     
     /** Appelée dans le thread principal (on a donc le droit de toucher à l'UI) avant le démarrage */
    			public void onPreExecute() {
    			 	pDialog = new ProgressDialog(NouveauClient.this);
                    pDialog.setMessage("Création de votre compte ...");
                    pDialog.setIndeterminate(false);
                    pDialog.setCancelable(true);
                    pDialog.show();
    			}
     
    		            /** Appelée dans un thread à part, recoit les mêmes paramètres que ceux passés à "execute()" 
                                 * @return */
    		            public JSONArray doInBackground(String ... urls)
    		            {
    				// Envoie de la commande http
    				try{
    		 		        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(6);
    				        nameValuePairs.add(new BasicNameValuePair("Nom", Nom.getText().toString()));
    				        nameValuePairs.add(new BasicNameValuePair("Prénom", Prenom.getText().toString()));
    				        nameValuePairs.add(new BasicNameValuePair("Ville", Ville.getText().toString()));
    				        nameValuePairs.add(new BasicNameValuePair("Code postal", Code_postal.getText().toString()));
    				        nameValuePairs.add(new BasicNameValuePair("Adresse", Adresse.getText().toString()));
    				        nameValuePairs.add(new BasicNameValuePair("Adresse Email", Email.getText().toString()));
     
    					HttpClient httpclient = new DefaultHttpClient();
    					HttpPost httppost = new HttpPost(URL2);
    					httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     
    					HttpResponse response = httpclient.execute(httppost);
    					HttpEntity entity = response.getEntity();
     
    		                        //String entityStr = EntityUtils.toString(entity);
     
    		                        //return new JSONArray(entityStr);
     
    				}catch(Exception e){
    					Log.e("GetServerDataTask", "Erreur de récupération des données",e);
    				}
    		                return null;
    		            }
     
    		            /**
                                 * Appelé dans le thread UI, avec le retour de doInBackground. On peut donc modifier l'UI ici.
                                 */
    		            public void onPostExecute(JSONArray result) {
    		            	pDialog.dismiss();
    		            	startActivity(new Intent(NouveauClient.this , MenuPrincipal.class));
     
    		                 } 
    	}
    Peut-être que le problème vient de mon fichier PHP :

    <?php

    include ('JSON.php');

    // create a new instance of Services_JSON
    $json = new Services_JSON();

    mysql_connect("sql.free.fr","xxxxxx","xxxxx");

    mysql_select_db("xxxxx");
    $sql=mysql_query("INSERT INTO tclient (Nom,Prenom,Adresse,Ville,Code_postal,Email)
    VALUES ('".$_REQUEST['Nom']."','".$_REQUEST['Prenom']."','".$_REQUEST['Adresse']."'
    ,'".$_REQUEST['Ville']."','".$_REQUEST['Code_postal']."','".$_REQUEST['Email']."')");


    mysql_close();
    ?>

    Problème résolu, c'était bien une erreur dans le php.

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

Discussions similaires

  1. stocker des données Json dans une listview
    Par niggasinparis dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 27/05/2015, 10h58
  2. Une seule ListView pour plusieurs fichier php qui renvoie des données JSON
    Par max8392 dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 22/08/2014, 10h46
  3. Actualiser ListView AsyncTask
    Par red112 dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 07/12/2012, 11h15
  4. Problème d’ajouter des données JSON dans une ListView
    Par amirmejrii dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 05/03/2012, 21h43
  5. Problème remplissage listView avec 2 JSON
    Par Xenonmax dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 20/12/2011, 11h17

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