Il y a plein de problèmes dans le code montré:
1. Le logging...
La fonction "toString()" de l'exception ne va sortir qu'un texte simple...
Pour afficher à l'écran (Toast), il vaut mieux utiliser la fonction e.getLocalizedMessage()
Pour afficher dans les logs (Log.xxxx(...)) il faut ne *RIEN* faire, et passer l'exception à la fonction de log... Pourquoi ? parceque le log va pouvoir afficher la stack-trace de l'exception...
Donc remplacer tous les Log.i(TAG,"Message "+e.toString()) en:
Log.i(TAG,"Message",e);
Ensuite, nous dire si il y a quelque chose dans le logcat.
2. La conversion en string de la réponse.
Je sais qu'on trouve (hélas) ce bout de code sur Internet... mais httpcomponents 4 propose une fonction toute simple qui non seulement vous évite de réinventer la roue et de faire des erreurs en copiant du code permet aussi d'avoir un code qui fonctionne (par exemple le code "à la main" de lecture du InputStream ne tient absolument pas compte du character-encoding de la réponse...).
La fonction est simple:
1 2 3
|
HttpEntity entity = response.getEntity();
String entityAsString = EntityUtils.toString(entity); |
Et oui !
3. Utilisation de fonctions "lentes" (réseaux) dans le thread UI.
Le thread UI doit être rapide, et donc ne doit jamais faire d'appels potentiellement lents, en particulier des appels HTTP.
Ceci est d'autant plus vrai sous Android 3.x+ ou l'application crashera avec un "NetworkInUiThreadException"....
4. Mauvaise utilisation des try/catch.
Les try/catch ne servent pas à gérer les exceptions, mais à protéger du code... Si une exception se produit dans le bloc try et qu'elle est catchée, alors le programme continuera après le bloc try... Ce n'est clairement pas ce qu'on veut ici!
Si une exception à lieu dans la requête, il y a fort peu de chances qu'on veuille lire la réponse ! etc ... etc...
Un seul try / catch suffirait donc autour de tout le code !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
try {
//commandes httpClient
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.0.2.2:8888/file.php");
// nameValuePairs.add(new BasicNameValuePair("username", "Peyton"));
// nameValuePairs.add(new BasicNameValuePair("password", "123"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
String entityStr = EntityUtils.toString(entity);
JSONArray array = new JSONArray(entityStr);
....
} catch (Exception ex) {
Log.e(MON_APP,"Failed to read from server",ex);
String display = getString(R.string.error_message,ex.getLocalizedMessage());
Toast.makeToast(... , display, ...).show();
} |
Partager