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 :

Parser données JSON


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 131
    Par défaut Parser données JSON
    Bonjour alors voilà je suis entrain de faire une appli et je butte sur le parsage des donnees via GSon qui semble la librairie la plus rapide

    j'ai donc suivi un tuto, telecharger Gson , ajouter la librairie mais lorsque je lance l appli ca plante

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.os.NetworkOnMainThreadException

    je ne comprends pas trop ci joint mes fichiers



    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
     
    package com.example.test;
     
    import android.os.Bundle;
    import android.app.Activity;
     
    import com.google.gson.Gson;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.util.List;
     
     
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
     
    import android.util.Log;
    import android.widget.Toast;
     
    import com.example.model.Result;
    import com.example.model.SearchResponse;
     
     
    public class MainActivity extends Activity {
    	 String url = "http://search.twitter.com/search.json?q=javacodegeeks";
     
    	    @Override
    	    public void onCreate(Bundle savedInstanceState) {
     
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.activity_main);
     
    	        InputStream source = retrieveStream(url);
     
    	        Gson gson = new Gson();
     
    	        Reader reader = new InputStreamReader(source);
     
    	        SearchResponse response = gson.fromJson(reader, SearchResponse.class);
     
    	        Toast.makeText(this, response.query, Toast.LENGTH_SHORT).show();
     
    	        List<Result> results = response.results;
     
    	        for (Result result : results) {
    	            Toast.makeText(this, result.fromUser, Toast.LENGTH_SHORT).show();
    	        }
     
    	    }
     
    	    private InputStream retrieveStream(String url) {
     
    	        DefaultHttpClient client = new DefaultHttpClient(); 
     
    	        HttpGet getRequest = new HttpGet(url);
     
    	        try {
     
    	           HttpResponse getResponse = client.execute(getRequest);
    	           final int statusCode = getResponse.getStatusLine().getStatusCode();
     
    	           if (statusCode != HttpStatus.SC_OK) { 
    	              Log.w(getClass().getSimpleName(), 
    	                  "Error " + statusCode + " for URL " + url); 
    	              return null;
    	           }
     
    	           HttpEntity getResponseEntity = getResponse.getEntity();
    	           return getResponseEntity.getContent();
     
    	        } 
    	        catch (IOException e) {
    	           getRequest.abort();
    	           Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
    	        }
     
    	        return null;
     
    	     }
    }
    cela plante ici car en ne mettant juste ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void onCreate(Bundle savedInstanceState) {
     
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.activity_main);
    }
    il n y a aucune erreur, donc voila si vous pouvez m'aidez merci

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GSon qui semble la librairie la plus rapide
    Je croyais que c'était jackson ?

    En fait GSon (et Jackson) sont bien pour sérialiser/désérialiser plein d'objets complexes... quand on fait 3 properties par "élément" d'un tableau c'est autre chose, et si le tableau n'est pas très grand (< 10000 rows), on peut tout lire en mémoire et un simple: JSONArray array = new JSONArray(string); suffit

    Bon... alors trêve de bavardage, en ce qui concerne le code....
    Le NOMTE est une sécurité rajoutée depuis Android3 permettant de s'assurer que les programmeurs ne font pas des trucs sales, entre autre, des actions potentiellement longues dans le thread de l'UI (onClick, onCreate, ....).
    Non seulement, c'est pas agréable d'attendre 5s que le click sur un bouton réagisse, mais en plus, il y a un risque de "Non Responsive Application".

    On parle d'action lente, dès qu'un truc dure plus d'une demi seconde par exemple, ce qui est systématiquement le cas d'un appel sur le réseau (ouverture de la connexion réseau si pas déjà fait, résolution du nom du host, connexion TCP, envoi de la requête, attente de la réponse, réception de la réponse)... Donc dès qu'on touche au réseau, dans le thread UI, bim NOMTE.

    Voir les AsyncTask pour solutionner le problème.


    Indépendamment du NOMTE, quelques erreurs:
    * Pas de test sur la valeur de retour: "return null;" en cas d'erreur => NPE si exception il y a.
    * Aucun signalement de l'erreur à l'utilisateur...
    * pas d'utilisation de getContentEncoding() pour savoir quel charset est utilisé pour la réponse (là il utilise le default charset tout le temps)
    * Le test du status-code n'est pas bon.... toutes les valeurs de 200 à 399 sont sensées être "bonnes".... Surtout de 200 à 299 ^^

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 131
    Par défaut
    En fait j ai un tableau d'objets et dans les objets certaines property sont eux même des tableaux qui contiennent des objets qui eux même contiennent des property

    bah concernant la vitesse j ai vu ça ici

    http://martinadamek.com/2011/02/01/a...er-comparison/

    je vais voir ça pour l AsyncTask

    Merci

  4. #4
    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, mais ça c'est le parsing d'une donnée plein de fois etc...

    Sur une itération:
    http://www.martinadamek.com/2011/02/...le-iterations/

    D'un coup, l'utilisation de Jackson/GSon par rapport à "android de base" devient moins.... intéressante

    Un timing est intéressant par rapport à quelque chose... Ici, le HTTP Get peut prendre potentiellement 1 à 2 secondes (excellent serveur), rendant le parsing lui-même anecdotique, et du coup... l'optimisation du parsing est à réaliser ... plus tard

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 131
    Par défaut
    ok je vois ça ^^

    Sinon je regarde les tutos la par rapport a l asynctask mais je vois pas trop comment faire dans mon cas ?

    Il faut que j enleve tout ce qui se trouve dans mon oncreate et que je recreer une fonction externe qui extends asynctask c est ca ?

    Si tu as un tuto c est pas de refus

    Merci

  6. #6
    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
    Ben j'ai même posté dans la FAQ une classe pour lire du JSON....

    Par contre ça utilise l'implémentation par défaut d'Android, il suffit de la modifier un poil....
    http://www.developpez.net/forums/d12...lire-json-url/

Discussions similaires

  1. [AJAX] Crée dynamiquement des données JSON
    Par geforce dans le forum AJAX
    Réponses: 3
    Dernier message: 20/04/2010, 16h30
  2. [Dojo] Passage de données JSON avec xhrGet ou xhrPost
    Par Tavarez59 dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 29/10/2009, 17h58
  3. Réponses: 2
    Dernier message: 19/06/2009, 14h21
  4. parser un json
    Par Henry9 dans le forum jQuery
    Réponses: 4
    Dernier message: 18/05/2009, 21h13
  5. [AJAX]Récupération de données json (ajax)
    Par amarcil dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 31/10/2008, 19h47

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