Aller au contenu

JSON & ListView (e=NullPointerException)


Recommended Posts

Bonjour à tous,

J'ai un problème sans doute dans mon code que je n'arrive pas à trouver.

Mon appli, je vais chercher dans une base de données des données (xD comme si on le savait pas), et je veux les afficher dans une listView, problème le logCat me retourne un NullPointerException.

Voici le code :

JsonListViewActivity :

package fr.emergenceit.net;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class JsonListViewActivity extends ListActivity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    JSONObject json = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php");

    try{

	    JSONArray  pharmacie = json.getJSONArray("pharmacie");
	    for(int i=0;i<pharmacie.length();i++){
		 HashMap<String, String> map = new HashMap<String, String>();	 
		 JSONObject e = pharmacie.getJSONObject(i);
		 map.put("nomph", "ID_ville:" + e.getString("ID_ville"));
		 map.put("lat", "Nom_ville: " +  e.getString("Nom_ville"));
		 mylist.add(map);					   
	 }		 
    }
    catch(JSONException e) {
	    Log.e("log_tag", "Error parsing data "+e.toString());
    }

    ListAdapter adapter = new SimpleAdapter(
	   this,
	   mylist,
	   R.layout.main,
 new String[] { "nomph", "lat" },
    new int[] { R.id.item_title, R.id.item_subtitle });
 setListAdapter(adapter);

 final ListView lv = getListView();
    lv.setTextFilterEnabled(true); 
    lv.setOnItemClickListener(new OnItemClickListener() {
	 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	  @SuppressWarnings("unchecked")
		    HashMap<String, String> o = (HashMap<String, String>)
		 lv.getItemAtPosition(position);						
	  Toast.makeText(JsonListViewActivity.this, "ID '" + o.get("id") + "'was clicked.", Toast.LENGTH_SHORT).show();
	 }
    });

   }
}

JSONfunctions.java :

package fr.emergenceit.net;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONfunctions {

public static JSONObject getJSONfromURL(String url){
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    //http post
 try{
		 HttpClient httpclient = new DefaultHttpClient();
		 HttpPost httppost = new HttpPost(url);
		 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());
 }

 //convert response to string
 try{
		 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
		 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());
 }

 try{
  jArray = new JSONObject(result);		   
 } catch(JSONException e ){
		 Log.e("log_tag", "Error parsing data "+e.toString());
 }

 return jArray;
}
}

ville.php affiche :

[{"ID_ville":"1","Nom_ville":"Paris"},{"ID_ville":"2","Nom_ville":"Lille"},{"ID_ville":"3","Nom_ville":"Marseille"},{"ID_ville":"4","Nom_ville":"Lyon"},{"ID_ville":"5","Nom_ville":"Toulouse"},{"ID_ville":"6","Nom_ville":"Bordeaux"},{"ID_ville":"7","Nom_ville":"Nimes"}]

LogCat :

11-11 13:53:25.623: E/AndroidRuntime(1715): Uncaught handler: thread main exiting due to uncaught exception

11-11 13:53:25.633: E/AndroidRuntime(1715): java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.emergenceit.net/fr.emergenceit.net.JsonListViewActivity}: java.lang.NullPointerException

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.access$2200(ActivityThread.java:119)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.os.Handler.dispatchMessage(Handler.java:99)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.os.Looper.loop(Looper.java:123)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.main(ActivityThread.java:4363)

11-11 13:53:25.633: E/AndroidRuntime(1715): at java.lang.reflect.Method.invokeNative(Native Method)

11-11 13:53:25.633: E/AndroidRuntime(1715): at java.lang.reflect.Method.invoke(Method.java:521)

11-11 13:53:25.633: E/AndroidRuntime(1715): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

11-11 13:53:25.633: E/AndroidRuntime(1715): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

11-11 13:53:25.633: E/AndroidRuntime(1715): at dalvik.system.NativeStart.main(Native Method)

11-11 13:53:25.633: E/AndroidRuntime(1715): Caused by: java.lang.NullPointerException

11-11 13:53:25.633: E/AndroidRuntime(1715): at fr.emergenceit.net.JsonListViewActivity.onCreate(JsonListViewActivity.java:31)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

Lien vers le commentaire
Partager sur d’autres sites

Comme le montre les logs, tu as une NullPointerException en ligne 31 de ton activity, c'est là qu'il aurait fallu chercher...

Mais, au vu du code, il y a quelques petits points qui font, à mon avis, que ça ne marche pas:

- le parsing d'une chaîne au format JSON se fait à l'aide de la classe JSONTokener, pas directement avec JSONObject

- ton script PHP te retourne un tableau d'objets, pas un objet, et donc ta méthode de parsing devrait retourner un JSONArray, pas un JSONObject

Voila les corrections que tu pourrais apporter:

- dans la classe JSONFunctions, remplacer la ligne

jArray = new JSONObject(result);

par

jArray = (JSONArray)new JSONTokener(result).nextValue();

et changer le type de retour de la fonction getJSONFromUrl en JSONArray

- dans la classe de ton Activity, supprimer la ligne

JSONObject json = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php"); 

et remplacer la ligne

JSONArray  pharmacie = json.getJSONArray("pharmacie"); 

par

JSONArray pharmacie = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php");

Cela devrait ensuite mieux fonctionner

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup de ta réponse mais malheureusement j'ai déjà résolu le problème hier soir (j'ai pas eu le temps de venir ici mettre résolu).

En faite je pense qu'avec ta méthode çà marcherai, mais moi j'ai triché dans mon code PHP pour que çà marche ^^

Enfin bon tant que çà marche c'est mon patron qui est content.

Juste dommage que la communauté ne soit pas plus présente sur ce forum.

D'ailleurs on fait comment pour mettre en résolut ?

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...