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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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 confirmé
    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
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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 confirmé
    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
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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

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