Bonsoir,
J'ai récréé une appli simplifiée qui illustre le problème auquel je suis confronté sur ma véritable application. Son but final est de parser différents JSONObjects à des URL différents pour les afficher selon le JSONObject renvoyé.
Elle contient :
Un JSONParser on ne peut plus classique :
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 public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient HttpParams params = new BasicHttpParams(); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpClient httpClient = new DefaultHttpClient(params); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); 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(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); }
Une classe MainActivity :
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 public class MainActivity extends ActionBarActivity { private TextView tv; private static final String urllisteemplois = "l'url qui contient le json des emplois"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.text); JParse jParse = new JParse(urllisteemplois); jParse.execute(); String result = jParse.concat(); tv.setText(result); }
Et enfin une classe JParse qui extends AsyncTask :
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 public class JParse extends AsyncTask<String, String, JSONObject> { private String url; private JSONObject json; public JParse(String url) { this.url=url; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected JSONObject doInBackground(String... args) { JSONParser jParser = new JSONParser(); JSONObject json2 = jParser.getJSONFromUrl(url); return json2; } @Override protected void onPostExecute(JSONObject json2) { this.json=json2; } public String concat() { String result = this.json.toString()+"hello"; return result; }
L'erreur est liée au fait que this.json est null dans la méthode concat() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 01-20 03:18:43.797 2298-2298/com.badak.bdk.app E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.badak.bdk.ryadencule, PID: 2298 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.badak.bdk.app/com.badak.bdk.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
Je peux pour l'instant affirmer que :
-le this.json dans le onPostExecute est bien à jour.
-ayant fait le test avec des integer au lieu des JSON (et n'ayant pas parsé ces integer depuis une url), l'appli fonctionne.
-je ne saurais pas dire pourquoi mais parfois le onPostExecute ne se lance pas de lui même et je dois le lancer manuellement.
Autre problème qui n'a rien à voir, il m'arrive fréquemment de modifier des instructions dans mon code, et quand j'execute je me rends compte dans le logcat qu'elles n'ont pas été prises en compte. Une idée de comment régler ce problème (du coup ça m'empêche d'avancer dans mes tests en plus...). J'utilise android studio, dernière version, et je teste mes codes sur emulateur.
Voilà, merci d'avance pour l'attention que vous porterez à ce problème qui me rend dingue depuis une semaine 8). Si vous avez des questions n'hésitez pas.
Partager