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 :

Problème Optimisation JSON Parser


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut Problème Optimisation JSON Parser
    Bonjour, je suis sur un projet dans lequel je récupère un JSON (de mon webservice) et je le parse en retournant un JSONArray.

    J'ai des soucis de performance et cela plante sous android 4.0 (ne plante pas sur 2.3.3 mais est un peu long).

    Pouvez vous m'aider quant a l'optimisation de mon code et pourquoi pas d'autres methodes pour recuperer un JSON dans un JSONArray.

    Voici mon parser:
    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
    public class JSONParser 
    {
     
        static InputStream is = null;
        static JSONObject jObj = null;
        static String jsonstr = "";
     
        public JSONParser() {}
     
        public JSONArray getJSONFromUrl(String url) 
        {
     
            // Creation de la requete HTTP
            try {
     
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);
     
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();           
     
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
     
            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();
                jsonstr = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
            JSONArray jArray = null;
     
            // Parsing de la chaine pour la convertir en JSONArray
            try {
                jArray = new JSONArray(jsonstr);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing de Mon fichier: " + e.toString());
            }
     
            return jArray;
        }
    }
    Voici mon activite:

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    public class TabNewsJSONParsingActivity extends ListActivity 
    {
     
    	// url to make request
    	private static String url = "http://www.example.com/GetEvents?zone=8";
     
    	//JSON names
    	private static final String TAG_content = "content";
    	private static final String TAG_zone = "zone";
    	private static final String	TAG_id = "id";
    	private static final String	TAG_area = "area";
    	private static final String	TAG_title = "title";
    	private static final String	TAG_date = "date";
    	private static final String TAG_author = "author";
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) 
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.onglet_news);
     
    		// Hashmap for ListView
    		ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>();
     
    		// Creating JSON Parser instance
    		JSONParser jParser = new JSONParser();
     
    		// getting JSON string from URL
    		JSONArray json = jParser.getJSONFromUrl(url);
     
    		try {
    				for(int i=0; i < json.length(); i++)
    				{
    					JSONObject child = json.getJSONObject(i);
     
    					String id = child.getString(TAG_id);
    					String title = child.getString(TAG_title);
    					String content = child.getString(TAG_content);
    					String date = child.getString(TAG_date);
    					String author = child.getString(TAG_author);
    					String zone = child.getString(TAG_zone);
    					String area = child.getString(TAG_area);
     
     
    					// creating new HashMap
    					HashMap<String, String> map = new HashMap<String, String>();
     
    					// adding each child node to HashMap key => value
    					map.put(TAG_content, content);
    					map.put(TAG_title, title);
    					map.put(TAG_author, author);
     
    					// adding HashList to ArrayList
    					newsList.add(map);
    				}
    			}
    		catch (JSONException e) {
    			e.printStackTrace();
    		}
    		/**
                     * Updating parsed JSON data into ListView
                     * */
    		ListAdapter adapter = new SimpleAdapter(this, newsList,R.layout.onglet_news_listitem,new String[] { TAG_content, TAG_title, TAG_author }, new int[] {R.id.name, R.id.email, R.id.mobile });
    		setListAdapter(adapter);
     
    		// selecting single ListView item
    		ListView lv = getListView();
     
    		// Launching new screen on Selecting Single ListItem
    		lv.setOnItemClickListener(new OnItemClickListener() 
    		{
    			public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
    				// getting values from selected ListItem
    				String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
    				String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
    				String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();
     
    				// Starting new intent
    				Intent in = new Intent(getApplicationContext(), TabNewsSingleMenuItemActivity.class);
    				in.putExtra(TAG_content, name);
    				in.putExtra(TAG_title, cost);
    				in.putExtra(TAG_author, description);
    				startActivity(in);
     
    			}
    		});
    	}
     
    	public boolean onOptionsItemSelected(MenuItem item) 
    	{	
    	   //On regarde quel item a été cliqué grâce à son id et on déclenche une action
    	   switch (item.getItemId()) 
    	   {
    	      case R.id.credits:
    	    	 //pop up
    	        Toast.makeText(TabNewsJSONParsingActivity.this, "Un delire", Toast.LENGTH_SHORT).show();
    	         return true;
    	      case R.id.quitter:
    	         //Pour fermer l'application il suffit de faire finish()
    	         finish();
    	         return true;
    	   }
    	 return false;  
    }
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Si comme tu le dis, "ça plante", peux-tu nous montrer les messages d'erreur ?

  3. #3
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Quand tu dis "ça plante", quelle est l'erreur ? (le stacktrace complet si possible).

    Si c'est bien le code qui suit celui de l'autre sujet, je subodore donc une exception "NetworkOnMainTaskException" (ou quelque chose approchant).

    Donc => le DL et parsing en tâche asynchrone (tu peux regarder les AsyncTask, ou le couple habituel Thread/Handler).

    EDIT : grillé
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  4. #4
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    lol Hizin

    oui mon erreur est celle-ci :
    "Caused by: android.os.NetworkOnMainThreadException" at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork..

    Quelqu'un pour m'aider ?

    PS: etrange que cela ne plante pas sous 2.3.3

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Citation Envoyé par eento
    PS: etrange que cela ne plante pas sous 2.3.3
    Non, c'est normal, cette exception n'apparaît qu'a partir de HoneyComb (Android 3, API level 11).
    C'est une mauvaise pratique et il est très fortement conseillé (pour ne pas dire "obligé") de ne pas faire ça.
    J'imagine que Google en a eu marre de devoir répéter et voir des dév' pourrir l'expérience utilisateur en faisant ça, donc ils ont mis une exception qui envoi paître.

    Sinon, tu as déjà ta réponse =>
    Citation Envoyé par Moi-même
    le DL et parsing en tâche asynchrone (tu peux regarder les AsyncTask, ou le couple habituel Thread/Handler).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Merci.

    Cela me semble complexe d'implementer une AsyncTask non ? Pas un peu fastidieux ?

    Peut etre une autre methode de Parsing ?

    Merci de m'aider en tout cas

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Le problème ne vient pas tellement du parsing mais plutôt du téléchargement.
    Comme l'a dit Hizin, télécharger en utilisant le Thread graphique est à bannir.

  8. #8
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Non, c'est simple.

    D'ailleurs, juste pour ton information, les tâches asynchrones sont monnaies courantes dans le monde du développement.
    Ne baisse pas les bras et regarde bien, tu verras que c'est très facile à implémenter (moins quand on prend en compte absolument tout les paramètres (rotation, arrêt de l'application, appel ...), mais ce n'est pas la mer à boire).

    Si tu changes le parsing, tu auras toujours la même erreur. Ton erreur là, est de faire un appel réseau dans le thread dédié à l'UI. Ce n'est pas que tu prends trop de temps, tu aurais une "Application Not Responding" ou ANR dans ce cas.

    Donc, tu as 2 solutions : ne pas faire d'appel réseau ou faire une tâche asynchrone.

    EDIT : et encore grillé
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Hehe tant pis Hizin


    Voilà le code que je te propose.
    Dans le onCreate, tu lance un Thread. Celui ci va aller chercher les infos sur le serveur, va les parser, puis les enregistrer. Il va ensuite dire au Handler qu'il a fini. Le Handler va enfin créer l'adapter et afficher la liste.

    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
     
    final static int SUCCESS = 0;
    ArrayList<HashMap<String, String>> newsList;
     
     
     
     
     
      Handler handler = new Handler() {
    		public void handleMessage(android.os.Message msg) {
    			switch (msg.what) {
    				case SUCCESS:
    					//TODO ici tu créé l'adapter et tu afficher la liste
    					ListAdapter adapter = new SimpleAdapter(this, newList, .........);
    					setListAdapter(adapter);
    					ListView lv = getListView();
    					lv.setOnItemClickListener(new OnItemClickListener() {
    					//...
    					});
    					break;
     
    				default: 
    					break;
    			}
    		}
    	};
     
     
    @Override
    public void onCreate(Bundle savedInstanceState){
    	//....
     
    	//TODO ici tu lances le Thread qui va chercher les informations dont tu as besoin
    	operations();
    }
     
     
    public void operations(){
    	new Thread(new Runnable() {
    			@Override
    			public void run() {
    				//TODO ici tu fais tes appels à ton serveur web
    				//TODO puis tu parse le JSON
    				newsList = taMethodePourParser();
    				//TODO et enfin tu passe le flambeau au Thread graphique pour qu'il s'occuppe du résultat
    				handler.sendMessage(handler.obtainMessage(SUCCESS));
    			}
    	}).start();
    }

  10. #10
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    En fait ce thread est quasi un duplicata du thread:

    http://www.developpez.net/forums/d12...on-webservice/

    (Ou j'ai d'ailleurs donné la solution AsyncTask)

    Pourquoi privilégier AsyncTask ?
    1. Gestion du cancel (si l'activité est terminée avant le thread le code donné par simon va planter)
    2. Gestion d'un nombre limité de "worker" threads (pour l'instant cela n'est pas un problème, mais si il y a une dizaine d'opérations à faire en background...).
    3. A propos des worker-thread justement, la création d'un thread est *très* long (adaptation du garbage-collector, rajout de racine pour forte références, création d'une pile d'appels, ...). AsyncTask réutilise un worker-thread déjà créé si il existe.
    4. C'est quand même plus simple

    D'autant que le JSONParser a vraiment vocation à devenir lui-même un AsyncTask
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    C'est pas faux.

    Je sais bien qu'il va planter lorsque l'activity sera finish (sauf si on demande isFinishing() dans le handleMessage().
    Mais juste pour info, comment fait-t-on pour cancel correctement un Thread comme celui de mon code ?

  12. #12
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Simon je ne vois pas ou placer le handler en fait , j'ai ceci :

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    // url to make request
    		private static String url = "http://www.example.com/GetEvents?zone=8";
     
    		//JSON names
    		private static final String TAG_content = "content";
    		private static final String TAG_zone = "zone";
    		private static final String	TAG_id = "id";
    		private static final String	TAG_area = "area";
    		private static final String	TAG_title = "title";
    		private static final String	TAG_date = "date";
    		private static final String TAG_author = "author";
     
    		final static int SUCCESS = 0;
     
    		@Override
    		public void onCreate(Bundle savedInstanceState){
    			super.onCreate(savedInstanceState);
    			setContentView(R.layout.onglet_news); 
    			//TODO ici tu lances le Thread qui va chercher les informations dont tu as besoin
    			operations();
    		}
     
     
    		public void operations()
    		{
    			new Thread(new Runnable() 
    			{
    					public void run() 
    					{
    						//TODO ici tu fais tes appels à ton serveur web
    						//TODO puis tu parse le JSON
     
     
    						ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>();
    						JSONParser jParser = new JSONParser();
    						JSONArray json;
    						try {
    							json = jParser.getJSONFromUrl1(url);
     
    									for(int i=0; i < json.length(); i++)
    									{
    										JSONObject child = json.getJSONObject(i);
     
    										String id = child.getString(TAG_id);
    										String title = child.getString(TAG_title);
    										String content = child.getString(TAG_content);
    										String date = child.getString(TAG_date);
    										String author = child.getString(TAG_author);
    										String zone = child.getString(TAG_zone);
    										String area = child.getString(TAG_area);
     
     
    										// creating new HashMap
    										HashMap<String, String> map = new HashMap<String, String>();
     
    										// adding each child node to HashMap key => value
    										map.put(TAG_content, content);
    										map.put(TAG_title, title);
    										map.put(TAG_author, author);
     
    										// adding HashList to ArrayList
    										newsList.add(map);
    									}
    								}
    							catch (JSONException e) {
    								e.printStackTrace();
    							} catch (IOException e) {
    								e.printStackTrace();
    							}
    						//TODO et enfin tu passe le flambeau au Thread graphique pour qu'il s'occuppe du résultat
    						 Handler handler = new Handler() {
    								public void handleMessage(android.os.Message msg) 
    								{
    									switch (msg.what) 
    									{
    										case SUCCESS:
    											//TODO ici tu créé l'adapter et tu afficher la liste
    											ListAdapter adapter = new SimpleAdapter(this, newsList,R.layout.onglet_news_listitem,new String[] { TAG_content, TAG_title, TAG_author }, new int[] {R.id.name, R.id.email, R.id.mobile });
    											setListAdapter(adapter);
    											ListView lv = getListView();
    											lv.setOnItemClickListener(new OnItemClickListener() 
    											{
    												public void onItemClick(AdapterView<?> parent, View view,int position, long id) 
    												{
    													// getting values from selected ListItem
    													String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
    													String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
    													String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();
     
    													// Starting new intent
    													Intent in = new Intent(getApplicationContext(), TabNewsSingleMenuItemActivity.class);
    													in.putExtra(TAG_content, name);
    													in.putExtra(TAG_title, cost);
    													in.putExtra(TAG_author, description);
    													startActivity(in);
     
    												}});
    											break;
    										default: 
    											break;
    									}
    								}
     
    								@Override
    								public void close() {
    									// TODO Auto-generated method stub
     
    								}
     
    								@Override
    								public void flush() {
    									// TODO Auto-generated method stub
     
    								}
     
    								@Override
    								public void publish(LogRecord record) {
    									// TODO Auto-generated method stub
     
    								}
    						 };
    						handler.sendMessage(handler.obtainMessage(SUCCESS));
    					}
    			}).start();
    		}
    je ne sais pas ou placer le handler en fait :s

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Le Handler est un attribut de classe.
    Il doit se situer au même niveau que final static int SUCCESS = 0;

  14. #14
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    j'ai fait ceci mais ma ListAdapter adapter().. me met une erreur a la compile : "the constructor SimpleAdapter(...) is undefined".

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    public class TabNewsJSONParsingActivity2 extends ListActivity
    	{
    	    static{
    	        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
     
    	        StrictMode.setThreadPolicy(policy);
    	    }
     
    	    // url to make request
    	    private static String url = "http://www.example.com/GetEvents?zone=8";
     
    	    //JSON names
    	    private static final String TAG_content = "content";
    	    private static final String TAG_zone = "zone";
    	    private static final String TAG_id = "id";
    	    private static final String TAG_area = "area";
    	    private static final String TAG_title = "title";
    	    private static final String TAG_date = "date";
    	    private static final String TAG_author = "author";
     
    	    @Override
    	    public void onCreate(Bundle savedInstanceState) 
    	    {
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.onglet_news);
     
     
     
    	        // selecting single ListView item
    	        ListView lv = getListView();
     
    	        // Launching new screen on Selecting Single ListItem
    	        lv.setOnItemClickListener(new OnItemClickListener() 
    	        {
    	            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
    	                // getting values from selected ListItem
    	                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
    	                String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
    	                String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();
     
    	                // Starting new intent
    	                Intent in = new Intent(getApplicationContext(), TabNewsSingleMenuItemActivity.class);
    	                in.putExtra(TAG_content, name);
    	                in.putExtra(TAG_title, cost);
    	                in.putExtra(TAG_author, description);
    	                startActivity(in);
     
    	            }
    	        });
     
    	        new DownloadData().execute();
    	    }
     
    	    public boolean onOptionsItemSelected(MenuItem item) 
    	    {   
    	       //On regarde quel item a été cliqué grâce à son id et on déclenche une action
    	       switch (item.getItemId()) 
    	       {
    	          case R.id.credits:
    	             //pop up
    	            Toast.makeText(TabNewsJSONParsingActivity2.this, "Un delire", Toast.LENGTH_SHORT).show();
    	             return true;
    	          case R.id.quitter:
    	             //Pour fermer l'application il suffit de faire finish()
    	             finish();
    	             return true;
    	       }
    	     return false;  
    	    }
     
     
    	    private class DownloadData extends AsyncTask<Void, Integer, ArrayList<HashMap<String, String>>>
    	    {
    	        ProgressDialog pd = null;
    	        /* (non-Javadoc)
    	         * @see android.os.AsyncTask#onPreExecute()
    	         */
    	        @Override
    	        protected void onPreExecute() {
    	            // TODO Auto-generated method stub
    	            super.onPreExecute();
     
    	            pd = new ProgressDialog(TabNewsJSONParsingActivity2.this);
    	            pd.setTitle("Downloading...");
    	            pd.setMessage("Please wait...");
    	            pd.setCancelable(false);
    	            pd.show();
    	        }
     
    	        /* (non-Javadoc)
    	         * @see android.os.AsyncTask#doInBackground(Params[])
    	         */
    	        @Override
    	        protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
    	            // TODO Auto-generated method stub
     
    	            // Hashmap for ListView
    	            ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>();
     
    	            // Creating JSON Parser instance
    	            JSONParser jParser = new JSONParser();
     
    	            // getting JSON string from URL
    	            JSONArray json;
    	            try {
    	                json = jParser.getJSONFromUrl1(url);
     
    	                        for(int i=0; i < json.length(); i++)
    	                        {
    	                            JSONObject child = json.getJSONObject(i);
     
    	                            String id = child.getString(TAG_id);
    	                            String title = child.getString(TAG_title);
    	                            String content = child.getString(TAG_content);
    	                            String date = child.getString(TAG_date);
    	                            String author = child.getString(TAG_author);
    	                            String zone = child.getString(TAG_zone);
    	                            String area = child.getString(TAG_area);
     
     
    	                            // creating new HashMap
    	                            HashMap<String, String> map = new HashMap<String, String>();
     
    	                            // adding each child node to HashMap key => value
    	                            map.put(TAG_content, content);
    	                            map.put(TAG_title, title);
    	                            map.put(TAG_author, author);
     
    	                            // adding HashList to ArrayList
    	                            newsList.add(map);
    	                        }
    	                    }
    	                catch (JSONException e) {
    	                    e.printStackTrace();
    	                } catch (IOException e) {
    	                    // TODO Auto-generated catch block
    	                    e.printStackTrace();
    	                }
     
    	            return newsList;
    	        }
     
    	        /* (non-Javadoc)
    	         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
    	         */
    	        @Override
    	        protected void onPostExecute(ArrayList<HashMap<String, String>> newsList) {
    	            // TODO Auto-generated method stub
    	            super.onPostExecute(newsList);
    	            pd.dismiss();
     
    	            /**
                         * Updating parsed JSON data into ListView
                         * */
    	            ListAdapter adapter = new SimpleAdapter(this, newsList,R.layout.onglet_news_listitem,new String[] { TAG_content, TAG_title, TAG_author }, new int[] {R.id.name, R.id.email, R.id.mobile });
    	            TabNewsJSONParsingActivity2.this.setListAdapter(adapter);
    	        }
     
    	    }
    }

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Le message complet s'il te plait...

    Je pense que ça vient du this. Remplace le plutôt par getApplicationContext()

  16. #16
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Quand il y a une erreur TOUJOURS donner le stacktrace.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  17. #17
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Desole :s

    L'erreur etait bien celle-ci, mon code marche nikel chrome!!

    je vous remercie a 100 % les mecs vous etes au top

    Par contre des fois quand je fais une rotation l'appli plante :s

  18. #18
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Simonmarky Voir le message
    Mais juste pour info, comment fait-t-on pour cancel correctement un Thread comme celui de mon code ?
    Il faut rajouter une fonction "cancel()" qui en général fait un truc dans ce gout la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public synchronized void cancel()
    {
         this.ended = true;
         interrupt();
    }
    Et dans le run() bien vérifier les "InterruptedException" et s'arrêter de traiter un truc dès qu'on a le flag "ended".
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  19. #19
    Membre du Club
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Ok ca marche je regarderais a l'occaz

    Merci beaucoup en tout cas.

    peace

Discussions similaires

  1. [XML] Problème avec le parser SAX
    Par carmensam dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 28/08/2009, 16h50
  2. Problème avec JSON
    Par oprami dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 05/10/2008, 22h05
  3. problème avec XML::parser
    Par mbhfr06 dans le forum Modules
    Réponses: 4
    Dernier message: 23/08/2007, 14h15
  4. Problème avec le parser XML
    Par sheura dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 09/11/2005, 18h26
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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