2012-03-29 12 views
0

Ich arbeite an der Analyse einer Website in meiner Anwendung.AsyncTask in Android?

Dies ist die Website: https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

Da ich damit einige Schwierigkeiten gehabt haben, habe ich versucht zunächst eine Klasse die gesamte Website zu erhalten, die mit AsyncTask erstreckt.

Hier ist der Code, der über alles von der Website bekommt:

 private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 

Wenn Sie jedoch auf die Website gehen, ich will nur den Teil nach Raten. Ich muss den obigen Code bearbeiten, damit er nur das zurückgibt, was ich brauche.

Basierend auf dem, was ich verstehe, weiß ich, dass ich String-Antwort auf eine ArrayList ändern muss, und ich muss die While-Schleife ändern, aber ich weiß nicht, was ich genau machen soll.

Ich habe versucht, mit dem folgenden Code die Methode zu ändern, aber es hat nicht funktioniert.

 private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<String>> { 
    @Override 
    protected ArrayList<String> doInBackground(String... urls) 
    { 
     ArrayList<String> response = new ArrayList<String>(); 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = response.toString(); 
       while ((s = buffer.readLine()) != null) 
       { 
        JSONArray ja = new JSONArray(s); 
        for (int i = 0; i < ja.length(); i++) { 
         JSONObject jo = (JSONObject) ja.get(i); 
         response.add(jo.getString("rates")); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 

Jede Hilfe würde sehr geschätzt werden.

@Dheeraj, UPDATE:

while ((s = buffer.readLine()) != null) 
    { 
     JSONArray ja = new JSONObject().getJSONArray("rates"); 
     response.add(ja.toString()); 
    } 

Das ist, was ich bisher Dheeraj haben. Ich bin auf, wie man den Puffer zu einem JSONObject bereitstellt. Kannst du mir helfen?

+0

Wie hat es funktioniert nicht? – huntsfromshadow

+0

Es lief und es hat mir keine Fehler geben, aber wenn ich hinzugefügt, um diese Methode: – sameetandpotatoes

+0

protected void OnPostExecute (Arraylist Ergebnis) { \t \t \t tv.setText (result.get (0)); } Dies bedeutet, dass das Ergebnis nichts enthält (IndexOutofBoundsException wurde ausgelöst) – sameetandpotatoes

Antwort

1
  1. Geben Sie den gesamten Puffer, den Sie vom Netzwerk erhalten, an JSONObject.
  2. [Edit: Korrigierte dank @MisterSquonk] Vom JSONObject den Wert von "Raten" erhalten als eine andere JSONObject mit getJSONObject("rates").
  3. Iterieren Sie über die Schlüssel des "rates" -Objekts, um seine Werte zu erhalten.

Hier ist der Code:

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<String>> { 
    @Override 
    protected ArrayList<String> doInBackground(String... urls) { 
     ArrayList<String> response = new ArrayList<String>(); 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 
       InputStreamReader isr = new InputStreamReader(content); 
       StringBuilder sb = new StringBuilder(); 
       char[] buffer = new char[1024]; 
       while (isr.read(buffer) != -1) { 
        sb.append(buffer); 
       } 
       JSONObject jobj = new JSONObject(sb.toString()); 
       JSONObject ratesObj = jobj.getJSONObject("rates"); 
       Iterator<String> keys = ratesObj.keys(); 
       while (keys.hasNext()) { 
        response.add(ratesObj.getString(keys.next())); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 
+0

Die Verwendung einer JSON-Parsing-Bibliothek ist genau das, was Sie hier tun möchten. Der Code, den Sie oben angegeben haben, erfindet das Rad wirklich neu, weil es bereits robuste Lösungen für Ihr Problem gibt. Benutze die Bibliothek, keine Kopfschmerzen! – mtmurdock

+0

Ich würde es wirklich schätzen, wenn Sie schreiben könnten, was Sie in Code angegeben haben. Ich bin mir nicht sicher, wie ich programmieren soll, was Sie gesagt haben. Vielen Dank. – sameetandpotatoes

+0

@ user1193587 Ich möchte Ihnen helfen, wenn Sie versuchen können, es zu kodieren und alle Probleme zu posten, denen Sie gegenüberstehen. –