AsyncTask richtig einsetzen

  • 4 Antworten
  • Letztes Antwortdatum
L

Lainio

Ambitioniertes Mitglied
3
Hallo liebes Forum,

ich habe bisher folgenden Code im Main-Thread gehabt.

PHP:
        ArrayList<HashMap<String,String>> menuItems = new ArrayList<HashMap<String, String>>();

        XMLParser parser = new XMLParser();
        String xml = parser.getXMLFromUrl("http://api.androidhive.info/pizza/?format=xml");
        Document doc = parser.getDomElement(xml);

        NodeList nl = doc.getElementsByTagName("KEY_project");

        for (int i = 0; i < nl.getLength(); i++) {
            // Neue HashMap erstellen
            HashMap<String,String> map = new HashMap<String,String>();
            Element e = (Element) nl.item(i);
            // Jedes Kind-Knoten zur HashMap
            map.put("uuid",parser.getValue(e,"uuid"));
            map.put("name", parser.getValue(e, "name"));
            map.put("jobtitle",parser.getValue(e,"jobtitle"));
            map.put("jobinfo" ,parser.getValue(e,"jobinfo"));

            //Hashmap zur ArrayList hinzufügen
            menuItems.add(map);

Durch Recherche habe ich dann herausgefunden das ich die Daten die aus dem Internet geholt werden müssen , ausgelagert werden müssen weil das im Main-Thread nicht erlaubt ist.

Die Frage ist jedoch wie wende ich das an? Muss ich nur diese Zeilen im AsyncTask auslagern?

PHP:
        XMLParser parser = new XMLParser();
        String xml = parser.getXMLFromUrl("http://api.androidhive.info/pizza/?format=xml");
        Document doc = parser.getDomElement(xml);


Wenn ja, wie müsste der return-Befehl der doInBackground-Methode aussehen??

Kann ich in der Ausgabe der onPostExecute() nur das XML-Dom ausgeben lassen um damit danach im Main-Thread weiter arbeiten zu können?

Ich habe mich hier eingelesen jedoch weiß ich derzeit nicht wie ich im Bezug darauf das anwenden soll.


Ich hoffe ihr könnt mir helfen :)

Ich sollte vielleicht noch erwähnen das ich mir die geladene XML Datei in einer ListView anzeigen lassen will.
Kommt die Übertragung in die Listview auch in die AsyncTask klasse?
 
Zuletzt bearbeitet:
Suche Dir ein anderes Tut. Das ist auf den Stand von Android 2.2. Am besten auf den Seiten von android.com.
 
  • Danke
Reaktionen: Lainio
Hey, bin echt kein Profi aber hatte vor kurzem ein ähnliches Problem.
Die Infos holst du in der DoIngBackround und den return machst du in der OnPostExecute.
Hab mal einen Teil meines Codes angehängt vielleicht hilft er dir ja. Wobei GetM die Klasse ist in der getInternetData, die Methode ist zum lesen und Umwandlung in einen String. Du solltest aber beachten das ich einen anderen Parser benutzt habe der nicht alles Umwandeln kann.

LG Chris
 

Anhänge

  • SecondsActivity.txt
    1,9 KB · Aufrufe: 82
  • Danke
Reaktionen: Lainio
Ja richtig, OnPostExecute ist dein Freund. In dieser callback Methode kannst du deine Daten persistieren/speichern.
 
  • Danke
Reaktionen: Lainio
super ich danke euch für die hilfreichen Antworten!!!

Der ursprüngliche Beitrag von 10:03 Uhr wurde um 11:41 Uhr ergänzt:

Ich habe jedoch jetzt ein weiteres Problem.

Ich scheine etwas falsch zu machen. Ich wollte jetzt das in der Methode onPostExecute, die Elemente die von der doInBackground Methode kommen in die ListView anzeigen.

Das Problem ist das ich einen falschen Context im meinem Adapter habe.
PHP:
ListAdapter adapter = new SimpleAdapter(getCallingActivity(), menuItems,
                    R.layout.list_item,
                    new String[]{KEY_NAME, KEY_JOBTITLE, KEY_JOBINFO}, new int[]{
                    R.id.name, R.id.jobtitle, R.id.jobinfo});

Das this in diesem Fall zeigt auf einen falschen Context. Was wäre den in dem Fall der richtige Context? kann man das this ersetzen?
 
Zurück
Oben Unten