JSON Array in listView ausgeben

  • Antworten:4
Daniel T.
  • Forum-Beiträge: 3

13.02.2012, 20:07:28 via Website

Hallo,

ich arbeite zur Zeit an einem kleinen Projekt (App für Cocktailrezepte) und komme nicht weiter... Ich habe einen Webserver mit einer MySQL Datenbank und ein PHP-Skript mit welcher ich eine bestimmte Tabelle auslese und in JSON konvertiere. Funktioniert soweit, ich kann mittels Android auf diese PHP-Datei zugreifen und das JSON-File lesen, an was es jedoch leider scheitert ist dass ich es richtig ausgeben kann, in meinem Fall in eine listView. Weiß nicht ob das die beste Möglichkeit ist, bitte um Anregungen...

kurze Beschreibung der Funktionsweise der App:
- Inhalt der Tabelle "cocktails": Feld "name", Feld "image, Feld "description"
- am Startscreen werden in einer listView die Cocktails angezeigt, also alle Einträge im Feld "name" der Tabelle "cocktails"
- bei Klick auf einen Cocktail wird durch eine neue Activity die jeweilige Beschreibung angezeigt, also die Felder "image" und "description"

EDIT: sorry, Fehlermeldung ganz vergessen...

102-13 20:12:20.902: E/log_tag(8536): Fehler bei der HTTP-Verbindung android.os.NetworkOnMainThreadException
202-13 20:12:20.902: E/log_tag(8536): Error converting result java.lang.NullPointerException
302-13 20:12:20.914: E/log_tag(8536): Error parsing data org.json.JSONException: End of input at character 0 of

hier der Code:
1package at.dtr.firstapp;
2
3import java.io.BufferedReader;
4import java.io.InputStream;
5import java.io.InputStreamReader;
6import java.util.ArrayList;
7
8import org.apache.http.HttpEntity;
9import org.apache.http.HttpResponse;
10import org.apache.http.NameValuePair;
11import org.apache.http.client.HttpClient;
12import org.apache.http.client.entity.UrlEncodedFormEntity;
13import org.apache.http.client.methods.HttpPost;
14import org.apache.http.impl.client.DefaultHttpClient;
15import org.json.JSONArray;
16import org.json.JSONException;
17import org.json.JSONObject;
18
19import android.app.Activity;
20import android.app.ListActivity;
21import android.os.Bundle;
22import android.util.Log;
23import android.widget.ArrayAdapter;
24
25public class FirstAppActivity extends ListActivity {
26 /** Called when the activity is first created. */
27 InputStream is;
28 ArrayList<String> results = new ArrayList<String>();
29 JSONObject json_data;
30
31 @Override
32 public void onCreate(Bundle savedInstanceState) {
33 super.onCreate(savedInstanceState);
34 //setContentView(R.layout.main);
35
36 // beim Start der Activity wird gleich getData() aufgerufen
37 getData();
38 }
39
40
41 public void getData() {
42
43 // IP angeben
44 String IP = "192.168.1.108";
45 // PHP-File angeben
46 String PhpFile = "getdata.php";
47
48
49 String result = "";
50 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
51
52 // Verbindung zur PHP-Datei wird hergestellt
53 try {
54 HttpClient httpclient = new DefaultHttpClient();
55 HttpPost httppost = new HttpPost("http://" + IP + "/" + PhpFile);
56 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
57 HttpResponse response = httpclient.execute(httppost);
58 HttpEntity entity = response.getEntity();
59 is = entity.getContent();
60 } catch (Exception e) {
61 Log.e("log_tag", "Fehler bei der HTTP-Verbindung " + e.toString());
62 }
63
64 // die Tabellendaten, die von der PHP-Datei ausgelesen wurden, werden in den String 'result' gespeichert
65 try {
66 BufferedReader reader = new BufferedReader(new InputStreamReader(
67 is, "iso-8859-1"), 8);
68 StringBuilder sb = new StringBuilder();
69 String line = null;
70 while ((line = reader.readLine()) != null) {
71 sb.append(line + "n");
72 }
73 is.close();
74 result = sb.toString();
75 } catch (Exception e) {
76 Log.e("log_tag", "Error converting result " + e.toString());
77 }
78
79 // String 'result' wird in ein JSON-Array konvertiert
80 try {
81 JSONArray jArray = new JSONArray(result);
82 for (int i = 0; i < jArray.length(); i++) {
83 json_data = jArray.getJSONObject(i);
84 results.add((String) json_data.get("name") + " "
85 + json_data.get("image") + " " + json_data.get("description"));
86 }
87 fillList();
88 } catch (JSONException e) {
89 Log.e("log_tag", "Error parsing data " + e.toString());
90 }
91
92 }
93
94 // String 'result' wird in die listView geschrieben
95 public void fillList() {
96 this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
97 }
98
99
100
101
102}

hier der Link zum ganzen Eclipse-Project: Link

lg
Daniel

— geändert am 13.02.2012, 20:13:07

Antworten
Felix
  • Forum-Beiträge: 259

13.02.2012, 21:17:43 via Website

Tach!

102-13 20:12:20.902: E/log_tag(8536): Fehler bei der HTTP-Verbindung android.os.NetworkOnMainThreadException
202-13 20:12:20.902: E/log_tag(8536): Error converting result java.lang.NullPointerException
302-13 20:12:20.914: E/log_tag(8536): Error parsing data org.json.JSONException: End of input at character 0 of

Wenn ein Fehler bei der HTTP-Verbindung auftrat, lohnt es sich ja wohl kaum noch, mit der Verarbeitung fortzufahren. Dass diese wegen mangelnder Daten nicht erfolgreich ist, wundert mich nicht. Du musst mögliche Fehler in deinen kompletten Ablauf einplanen und sie nicht nur lokal fangen und ein bisschen (e.toString() ist nur der Name Exception ohne weitergehende Informationen) was davon ins Log schreiben.


Felix.

Antworten
Jochen Rühl
  • Forum-Beiträge: 133

14.02.2012, 07:56:45 via Website

Nach der Exception NetworkOnMainThreadException zu urteilen, machst Du die Netzwerkverbindung im Haupt-Thread der Applikation auf.
Dies ist seit HoneyComb nicht mehr erlaubt.

Versuch die Verbindung in einem eigenen Thread aufzumachen, dann sollte das funktionieren.

Gruß
Jochen

Antworten
Daniel T.
  • Forum-Beiträge: 3

16.02.2012, 11:07:30 via Website

Danke für die Antworten, hab es jetzt zusammengebracht einen neuen Thread zu starten, funkt einwandfrei....

Jedoch hab ich ein weiteres Problem: die listView auf dem Hauptscreen zeigt mir die Liste aller Cocktails, also pro Zeile den Wert des Feldes "name", ich will jedoch wenn ich auf einen Cocktail klicke ein weiteres Fenster mit den Feldern "image" und "description" sehen... Wie kann ich so etwas rein vom logischen her lösen? Ich hab bereits ein viertes Feld in der "cocktails"-Tabelle angelegt mit dem Namen "id", weiß aber nicht so wirklich wie ich das nun verwenden soll... Die Daten an sich hab ich ja beim Start der App schon geladen, sie müssten nur mehr Cocktail-spezifisch angezeigt werden..

hier der aktuelle Code: http://pastebin.com/QKJsLZqb

lg

Antworten
Felix
  • Forum-Beiträge: 259

16.02.2012, 21:48:10 via Website

Tach!

Mir fallen da zwei Möglichkeiten ein: eine weitere Activity oder ein Dialog.


Felix.

Antworten