Normal
Essaye de remonter ton code et voir ce qu'il se passe si une exception est lancée dans maconnexion_internet (au passage pas de '_' dans les identifiants Java) pendant l'execution de la requête HTTP...
On a une exception... on arrive dans le catch() qui fait
Log.i("taghttppost",""+e.toString());
Au passage, c'est quoi ce truc....
e.toString() est une String ... pourquoi concaténer avec "" avant ?
Sinon ce n'est pas du tout comme ça qu'on log une exception:
Log.e("taghttppost","Erreur pendant le post:",e);
donnera des résultats plus convaincants
Et ensuite ? et ben on continue...
Donc ligne suivante:
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
avec is qui est null toujours ....
Et bim => NullPointerException
Catchée... on se retrouve dans:
Log.i("tagconvertstr",""+e.toString());
(voir remarques ci-dessus).
Et .... on continue !!!!!! avec:
JSONArray jArray = new JSONArray(result);
et result qui est null....
Et bim => NullPointerException encore.... pas catchée cette fois... c'est une runtime (erreur de programmeur), et le programme s'arrête.
(a noter que si le JSON n'est pas bon on a encore un probleme)
Donc... commentaire #1: Revoir la gestion des exceptions en JAVA.
Tout le code en question pourrait être simplement remplacé par:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
// UN SEUL TRY/CATCH si une exception est lancée *tout* foire !
try{
//commandes httpClient
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
//httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// ouais, on utilise les super classes à notre disposition !
String entityStr = EntityUtils.toString(entity,"UTF-8");
JSONArray jArray = new JSONArray(result);
for(int i = 0; i < jArray.length(); i++) {
// récupérer un employé de type JSONObject
json_data = jArray.getJSONObject(i);
String n3=""+json_data.getString("auteur");
txt.setText(n3);
}
} catch (Exception e) {
Log.e("maconnexion_internet","Erreur de récupération des données",e);
} |
Bon... ceci étant fait ...
Il y a un règle de base en programmation: on ne fait pas de traitement potentiellement lent durant une réaction d'interface (ce qui est le cas dans 99% des fonctions issues du framework android, et en particulier onCreate de l'activité).
Quand on dit "potentiellement long" c'est n'importe quoi qui dure plus de quelques centièmes de secondes ! Hors une connexion internet fait largement partie de ce cas (le serveur peut être surchargé, et on peut compter facilement 1 minute le temps que la connexion soit refusée).
Comme *beaucoup* de programmeurs ne comprenaient pas cet état de fait. Google a rajouté une protection à partir de Android 3.0: un accès internet pendant le thread UI (donc le onCreate) lance automatiquement une exception "NetworkOnMainThreadException", forçant ceux-ci (les programmeurs ci-dessus) à utiliser les outils de multi-threading à leur disposition à savoir: Loaders ou AsyncTask (ma préférence allant à ce dernier).
A mon sens ils devraient faire de même pour les accès aux fichiers (que ce soit directement ou par database).
Partager