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 :

Affichage "résultat recherche" JSON


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Affichage "résultat recherche" JSON
    Salut a tous,


    Voila je travail sur une fonction qui pourrais me permettre d'afficher les résultats d'un mot rechercher.
    mais voila les informations ne me sont pas retournée voila mes fichiers:

    Si une personne a une idée du problème serait très Yahoo !!!

    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
    <?php require 'connexion.php'; ?>
     
    <?php 
    		$response = array();
     
    	    ////////////////////////////////////////////////
    		//Executer la requete d'affichage
    		////////////////////////////////////////////////
     
    		$keyword = $_GET["keyword"];
     
    		$result = mysql_query("SELECT nom FROM contact WHERE nom LIKE '%$keyword%' LIMIT 0, 20") or die(mysql_error());
     
    		if(mysql_num_rows($result) > 0){ 
     
    			$response["contact"] = array();
     
    				while($row = mysql_fetch_array($result)){
     
    					$personne = array();
    					$personne["idCONTACT"] = $row["idCONTACT"];
    					$personne["nom"] = $row["nom"];
    					$personne["prenom"] = $row["prenom"];
    					$personne["numero_mobile"] = $row["numero_mobile"];
    					$personne["numero_fixe"] = $row["numero_fixe"];
    					$personne["email"] = $row["email"];
    					$personne["adresse"] = $row["adresse"];
    					$personne["profession"] = $row["profession"];
     
    					array_push($response["contact"], $personne);
    				}
     
    				$response["success"] = 1;
        			echo json_encode($response);
    		}
     
    			else{
    	    		$response["success"] = 0;
    	    		$response["message"] = "Contact non Trouve !";
    	    		echo json_encode($response);
    	    	}
     ?>
    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
    161
    162
    163
    164
    165
    166
    167
    168
    public class ListResult extends ListActivity {
     
    	// attribut Chargement
        private ProgressDialog pDialog;
     
        // Creation dun objet Jsonparser
        JSONParser jParser = new JSONParser();
     
        ArrayList<HashMap<String, String>> contactList;
     
    	//  url permettant de retourner tous la liste des contacts
    	private static String url_search = "http://10.0.2.2/contactCloud/search_contact.php";//"http://10.0.2.2/contactCloud/list_contact.php"
     
     
        // JSON Node names
        private static final String TAG_SUCCESS = "success";
        private static final String TAG_CONTACT = "contact";
        private static final String TAG_IDCONTACT = "idCONTACT";
        private static final String TAG_NOM = "nom";
     
        // contacts JSONArray
        JSONArray contacts = null;
        //search key value
        public String searchkey;
     
        ///////////////////////////////////////////////////////////////////////////////////////
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.list_result);
     
            Intent myIntent = getIntent();
            // gets the arguments from previously created intent
            searchkey = myIntent.getStringExtra("keyword"); 
     
     
            // Hashmap d'une ListView
            /* Une collection de type Map est une collection qui fonctionne avec un couple clé - valeur.
             * La clé, qui sert à identifier une entrée dans notre collection, est unique. 
             * La valeur, au contraire, peut être associée à plusieurs clés.
             * */
            contactList = new ArrayList<HashMap<String, String>>();
     
            // Charges les contacts en Background Thread
            new LoadAllContacts().execute();
     
            // Retourne la listview
            ListView lv = getListView();
     
            /* Selection d'un seul contact
             * Lancement de la vue MajContactActivity
             * Ici on place un écouteur sur l'élément sélectionné. 
             * La méthode onItemClick() donne 4 arguments. 
             * Le troisième “int position”, est le seul qui nous intéresse, puisqu'il donne le numéro de l'élément cliqué dans la liste. 
             * */
            lv.setOnItemClickListener(new OnItemClickListener() {
     
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //retourne les valeur de la  ListItem selectionner
                    String iidCONTACT = ((TextView) view.findViewById(R.id.idCONTACT)).getText().toString();
     
                }
            });
            }
     
     
     
            /**
             * Background Async Task tous les contact en faisant HTTP Request
             * */
            class LoadAllContacts extends AsyncTask<String, String, String> {
     
                /**
                 * Avant de commencer en background thread affiche la Progress Dialog
                 * */
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    pDialog = new ProgressDialog(ListResult.this);
                    pDialog.setMessage("Chargement des contacts. Patienter...");
                    pDialog.setIndeterminate(false);
                    pDialog.setCancelable(false);
                    pDialog.show();
                }
     
     
                /**
                 * retourne tous les contacts via l'url
                 * */
                protected String doInBackground(String... args) {
     
                	// Construction des parametre
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
     
                    params.add(new BasicNameValuePair("keyword", searchkey)); 
     
                    // retourne la chaine de caractere en json via l'url
                    JSONObject json = jParser.makeHttpRequest(url_search, "GET", params);
     
                    // Affiche dans les logcat la response en json
                    Log.d("Cherche le contact: ", json.toString());
     
                    try {
                    	// vérifie si tous a bien reussi
                        int success = json.getInt(TAG_SUCCESS);
     
                        if (success == 1) {
                            // contacts found
                            // retourne le tableau de contact
                            contacts = json.getJSONArray(TAG_CONTACT);
     
                            // bouclage de tous les contacts
                            for (int i = 0; i < contacts.length(); i++) {
                                JSONObject c = contacts.getJSONObject(i);
     
                                // Stockage de chaque élément JSON dans la variable
                                String id = c.getString(TAG_IDCONTACT);
                                String nom = c.getString(TAG_NOM);
     
                                //Creation d'un nouveau HashMap
                                HashMap<String, String> map = new HashMap<String, String>();
     
                                // ajoute chaque noeud enfant de la HashMap key => value
                                map.put(TAG_IDCONTACT, id);
                                map.put(TAG_NOM, nom);
     
                                // ajoutan HashList à ArrayList
                                contactList.add(map);
                            }
                        } else {
                            // aucun contact trouver
                            // Lancement de l'ajoute d'un nouveau contact a l'activity
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
     
                    return null;
                }
     
                /**
                 * Après avoir terminé en Background enlever le dialogue de progression
                 * **/
                protected void onPostExecute(String file_url) {
                	// renvoie le dialogue après avoir retourne tous les contacts
                    pDialog.dismiss();
     
                    //Déposer le Runnable dans la file d'attente de l'UI thread
                    runOnUiThread(new Runnable() {
                        public void run() {
                        	//code exécuté par l'UI thread
                            /**
                             * Mise à jour des données analyser du JSON dans ListView
                             * */
                        ListAdapter adapter = new SimpleAdapter(
                        		ListResult.this, contactList, 
                        		R.layout.list_item, new String[] { TAG_IDCONTACT, TAG_NOM}, 
                            	new int[] { R.id.idCONTACT, R.id.nom });
                            // mise a jour de la listview
                            setListAdapter(adapter);
                        }
                    });
     
                }
     
            }
    }

    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
    public class SearchContact extends Activity implements OnClickListener{
     
    	private EditText txtkeyword;
    	private Button btnsearch;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.search_contact);
     
    		//link to UI
    		txtkeyword=(EditText)findViewById(R.id.txtkeyword);
    		btnsearch=(Button)findViewById(R.id.btnsearch);
    		btnsearch.setOnClickListener(this);
    	}
    	@Override
    	public void onClick(View v) {
    		if(v.getId()==R.id.btnsearch){
    			Intent searchIntent = new Intent(this, ListResult.class);
    			//send the keyword to the next screen
    			searchIntent.putExtra("key",txtkeyword.getText().toString());
    			//call the screen for listing
    			startActivity(searchIntent);
    		}
    	}
     
    }
    XML:
    Search_contact.xml
    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
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Search" >
     
    <TableLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" >
     
    <TableRow
    android:id="@+id/tableRow1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
     
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Recherche par nom:"
        android:textAppearance="?android:attr/textAppearanceLarge" />
     
    </TableRow>
     
    <TableRow
    android:id="@+id/tableRow2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
     
    <EditText
    android:id="@+id/txtkeyword"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:ems="10" >
     
    <requestFocus />
    </EditText>
     
    </TableRow>
     
    <TableRow
    android:id="@+id/tableRow3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
     
    <Button
        android:id="@+id/btnsearch"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Recherche" />
     
    </TableRow>
     
    <TableRow
    android:id="@+id/tableRow4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    </TableRow>
    </TableLayout>
     
    </RelativeLayout>
    list_result.xml
    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
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    		xmlns:tools="http://schemas.android.com/tools"
    		android:layout_width="match_parent"
    		android:layout_height="match_parent"
    		android:paddingBottom="@dimen/activity_vertical_margin"
    		android:paddingLeft="@dimen/activity_horizontal_margin"
    		android:paddingRight="@dimen/activity_horizontal_margin"
    		android:paddingTop="@dimen/activity_vertical_margin"
    		tools:context=".ListResult" >
     
    		<!-- Main ListView
    		Always give id value as list(@android:id/list)
    		-->
    		<ListView
    		android:id="@android:id/list"
    		android:layout_width="fill_parent"
    		android:layout_height="wrap_content"/>
     
    </RelativeLayout>

    AndroidManifest.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- Recherche Contact Activity -->
            <activity
                android:name=".ListResult"
                android:label="Tous les contacts" >
            </activity>
     
            <activity
                android:name=".SearchContact"
                android:label="Recherche les contacts" >
            </activity>


    Erreur:
    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
    05-01 18:13:46.747: E/JSON Parser(1177): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
    05-01 18:13:52.007: W/dalvikvm(1177): threadid=11: thread exiting with uncaught exception (group=0xb3ab7ba8)
    05-01 18:13:57.737: E/AndroidRuntime(1177): FATAL EXCEPTION: AsyncTask #1
    05-01 18:13:57.737: E/AndroidRuntime(1177): Process: fr.paris8.contactcloud, PID: 1177
    05-01 18:13:57.737: E/AndroidRuntime(1177): java.lang.RuntimeException: An error occured while executing doInBackground()
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at android.os.AsyncTask$3.done(AsyncTask.java:300)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.lang.Thread.run(Thread.java:841)
    05-01 18:13:57.737: E/AndroidRuntime(1177): Caused by: java.lang.NullPointerException
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at fr.paris8.contactcloud.ListResult$LoadAllContacts.doInBackground(ListResult.java:128)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at fr.paris8.contactcloud.ListResult$LoadAllContacts.doInBackground(ListResult.java:1)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at android.os.AsyncTask$2.call(AsyncTask.java:288)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    05-01 18:13:57.737: E/AndroidRuntime(1177): 	... 4 more
    05-01 18:14:10.327: E/WindowManager(1177): android.view.WindowLeaked: Activity fr.paris8.contactcloud.ListResult has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b3de2108 V.E..... R.....ID 0,0-480,144} that was originally added here
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.Dialog.show(Dialog.java:286)
    05-01 18:14:10.327: E/WindowManager(1177): 	at fr.paris8.contactcloud.ListResult$LoadAllContacts.onPreExecute(ListResult.java:110)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.os.AsyncTask.execute(AsyncTask.java:535)
    05-01 18:14:10.327: E/WindowManager(1177): 	at fr.paris8.contactcloud.ListResult.onCreate(ListResult.java:71)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.Activity.performCreate(Activity.java:5231)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.ActivityThread.access$800(ActivityThread.java:135)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.os.Handler.dispatchMessage(Handler.java:102)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.os.Looper.loop(Looper.java:136)
    05-01 18:14:10.327: E/WindowManager(1177): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
    05-01 18:14:10.327: E/WindowManager(1177): 	at java.lang.reflect.Method.invokeNative(Native Method)
    05-01 18:14:10.327: E/WindowManager(1177): 	at java.lang.reflect.Method.invoke(Method.java:515)
    05-01 18:14:10.327: E/WindowManager(1177): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    05-01 18:14:10.327: E/WindowManager(1177): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    05-01 18:14:10.327: E/WindowManager(1177): 	at dalvik.system.NativeStart.main(Native Method)

  2. #2
    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
    Ben c'est assez simple:

    Utilisation (déréférencement) d'une référence nulle ligne 128 de ListResult.java (qui au passage, devrait s'appeler: ListResultActivity.java histoire de refleter son caractère principal: c'est une activité).

    Comme il ne doit pas y avoir les imports, et le package, les numéros de lignes sont faux dans le code collé, mais je subodore un probleme sur cette ligne là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Log.d("Cherche le contact: ", json.toString());
    Avec un "json" null...

    Pourquoi ?

    Simplement parce que la génération de cet objet (jParser.xxxxx) n'est pas dans le try/catch (qui suit) et donc la fonction doit avoir été programmée avec les pieds (désolé c'est plus fort que moi) et ne pas renvoyer d'exception en cas de problème, mais simplement un objet "null", ce qui n'est jamais testé par le code.


    Maintenant, je peux me fourvoyer completement... mais c'est l'idée...


    Ensuite pDialog n'est plus fermé et la référence est perdue d'une manière ou d'une autre ce qui produit l'erreur suivante.

    Questions:
    1. Pourquoi "p"Dialog ? Je comprends en "C" (p = pointer), mais en Java ou il n'y a pas de pointeur, et tout (sauf les types primitifs) est une référence.....
    2. Pourquoi pDialog, contactList et le parser sont des membres de l'activité ? Ne devraient-il pas être limité à l'AsyncTask ?
    3. Ou est le code du parser ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Merci de ta réponse code avec les pieds j'essayerais lors des jeux olympique sa marchera peut être lol
    alors voila le 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
    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
    package fr.paris8.contactcloud;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
     
    import java.util.List;
     
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import android.util.Log;
     
    public class JSONParser {
     
    	static InputStream is = null;
    	static JSONObject jObj = null;
    	static String json = "";
     
    	public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params){
     
    				/*********************************************************************************/
    				// Envoie de la commande http
    				/*********************************************************************************/
    				try {
     
    					if(method == "POST"){
     
    						DefaultHttpClient httpClient = new DefaultHttpClient();
    						// Afin de former notre requête POST nous allons créer un objet HttpPost(url) 
    						HttpPost httpPost = new HttpPost(url);
    						// Enfin, on lie la liste à notre requête
    						httpPost.setEntity(new UrlEncodedFormEntity(params));
     
    						// récupération du résultat de notre script Php
    						HttpResponse httpResponse = httpClient.execute(httpPost);
    						HttpEntity httpEntity = httpResponse.getEntity();
    						is = httpEntity.getContent();
     
    					}else if(method == "GET"){
     
    						DefaultHttpClient httpClient = new DefaultHttpClient();
    						String paramString = URLEncodedUtils.format(params, "utf-8");
    						url += "?" + paramString;
    						HttpGet httpGet = new HttpGet(url);
     
    						HttpResponse httpResponse = httpClient.execute(httpGet);
    						HttpEntity httpEntity = httpResponse.getEntity();
    						is = httpEntity.getContent();
    					}			
     
    				//notre requête Http POST peut renvoyer des exceptions, 
    				//durant la construction ou l’envoi de la requête. 
    				} catch (UnsupportedEncodingException e) {
    					e.printStackTrace();
    				} catch (ClientProtocolException e) {
    					e.printStackTrace();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
     
    				/*********************************************************************************/
    				/* Convertion de la requête en string */
    				/*********************************************************************************/
    				try {
    					//Nous n’avons plus qu’a lire le BufferedReader
    					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();
    					json = sb.toString();
    				} catch (Exception e) {
    					Log.e("Buffer Error", "Error converting result " + e.toString());
    				}
     
    				/*********************************************************************************/
    				// Parse les données JSON
    				/*********************************************************************************/
    				try {
    					jObj = new JSONObject(json);
    				} catch (JSONException e) {
    					Log.e("JSON Parser", "Error parsing data " + e.toString());
    				}
     
    				// return JSON String
    				return jObj;
    	}
     
    }

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Personne pour une petite idée ?

  5. #5
    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
    Ben si... c'est ce qu'il me semblait... le parser ne gère absoluement pas correctement les exceptions...

    Il fait bien des try / catch mais qui semblent plus là pour "faire compiler" plutôt que pour gérer les erreurs...
    La règle numéro #1 d'un "catch" c'est qu'on ne l'utilise que si:
    * on peut passer outre l'erreur (utiliser un autre algorithme... etc...);
    * on doit traduire l'erreur en une autre (probablement plus générique).

    En aucun cas, un catch ne doit faire un simple "log" de l'exception (et laisser le programme continuer). En plus là, c'est "ex.printStackTrace()" qui en Android devrait s'écrire: Log.e(TAG,"Problème pour tel ou tel truc",ex);

    Ainsi dans notre cas:

    Si le premier "try" foire, on se retrouve à continuer avec la suite... soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
    Qui va probablement lever une exception (NullPointerException) (puisque "is" est nul).
    (Au passage, l'ensemble du try en question pourrait être remplacé par un truc genre: String result = EntityUtils.toString(httpEntity); )

    Mais c'est pas grâve... on va continuer quand même ! (catch (Exception ex) )
    et arriver dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jObj = new JSONObject(json);
    Qui va probablement lever une exception du type JSONException ("" n'est pas un objet JSON valide).

    Mais là encore, c'est pas grâve on fait comme si de rien n'était... et on arrive à la fin: return jObj; qui est null.

    Donc en gros: l'appelant de n'a aucun moyen de savoir si:
    * Il n'y a pas d'accès réseau (ce qui est assez fréquent sur un mobile)
    * Il y a une erreur dans le JSON
    * Le serveur n'a pas répondu assez vite.
    ...


    Pour finir sur le code de ce parser:

    L’intérêt d'un objet de parser est de pouvoir en créer plusieurs à priori (dans des AsyncTask parallèles). Hors ceci est interdit par l'utilisation des variables statique !!!!!!!!! (une variable statique est exceptionnelle en Java, sauf pour des constantes).
    Pire encore... ces variables statiques n'ont une durée de vie utile *QUE* pendant la durée de vie de l'appel de la fonction... L'utilisation d'une variable statique fait que tout reste en mémoire ! un comble.
    Elle ne devrait donc être déclarées que durant l'appel de la fonction.


    Et enfin... le code m'interpelle (et le même avec "GET" plus loin).
    D'une part il y a peu de chances pour qu'il fonction (ce code signifie en java: est-ce que la chaine référencée par "method" est celle référencée par la constante privée locale à la fonction "POST", ce qui a fort peu de chance d'arriver).
    Une comparaison de chaines se fait pas .equals() ou .equalsIgnoreCase()
    Dans notre cas c'est encore plus simple, puisqu'il faudrait passer par un enum genre:
    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
     
    public class JSONParser {
        static public enum Method {
             POST,
             GET
        };
     
        public JSONObject makeHttpRequest(String url, Method method, List<NameValuePair> params){
            ...
            switch (method) {
              case POST:
                         ....
                         break;
              case GET:
                         ....
                         break;
           }
     
           ....
        }
    }
    Ce qui évitera les erreurs coté client de la fonction.



    Bref... commence par faire un "vrai" log des exceptions....
    Voir à les renvoyer quand cela fait sens (en particulier les IOException)

    Genre:
    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
     
    JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) throws IOException,JSONException { // la fonction renvoit les exceptions qui ont du sens pour l'appelant !
         JSONObject ret = null;
         try {
              DefaultHttpClient httpClient = new DefaultHttpClient();
     
              HttpUriRequest request;  // <= on factorise la construction de requête !!! pas l'appel à http client.
              if (method.equals("POST")) {
                   HttpPost httpPost = new HttpPost(url);
                   httpPost.setEntity(new UrlEncodedFormEntity(params));
                   request = httpPost;
              } else if (method.equals("GET")) {
                   String finalUrl = url + "?" + URLEncodedUtils.format(params, "utf-8"); // on ne modifie pas la valeur d'un paramètre (convention usuelle).
                   request = new HttpGet(url);
              } else
                   throw new IllegalArguementException(method+" is not a valid method !"); // ben oui faut aussi gérer ce cas là (sans, le compilateur devrait le dire d'ailleurs en disant que "request" n'est pas initialisé dans les lignes dessous).
     
              // A noter que toutes ces lignes peuvent être remplacées par ret = new JSONObject(EntityUtils.toString(httpClient.execute(request).getEntity()));  mais en moins clair :)
              HttpResponse response = httpClient.execute(request);
              HttpEntity respEntity = response.getEntity();
              String respStr = EntityUtils.toString(respEntity);              
              ret = new JSONObject(respStr);
         } catch (UnsupportedEncodingException e) {
              // ne devrait jamais arriver !
              throw new IllegalStateException("No valid encoding supported for the operation",e);
         } catch (ClientProtocolException e) {
              // probleme d'URL
              throw new IllegalArguementException("Invalid url protocol given: "+url,e); // d'ou l'interêt de ne pas modifier le paramètre !
          }
              // les autres exceptions (JSONException et IOException sont renvoyées à l'appelant)
     
         return ret;
    }
    et l'utilisation dans le doInBackground:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public ... doInBackground(...)
    {
          try {
              JSONParser parser = new JSONParser();
              JSONObject obj = parser.makeHttpRequest();
              decodeObject(obj); // ?
           } catch (Exception ex) {
              Log.e("MyBackgroundTask","Couldn't retrieve xxxxxxxxx",ex);
           }
           return ret;
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/10/2015, 15h06
  2. Affichage de résultat de recherche
    Par missastro dans le forum IHM
    Réponses: 5
    Dernier message: 03/08/2007, 11h33
  3. [MySQL] affichage des résultats d'une recherche dans la base
    Par dolf13 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 21/11/2006, 17h18
  4. Affichage des résultats d'un moteur de recherche
    Par poah dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 14h31

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