AsyncTask überspringt onPostExecute

L

Lainio

Ambitioniertes Mitglied
3
Hallo liebe Leute,

ich habe das Problem das nach meinem return-Befehl in der doInBackground-Methode nicht in die onPostExecute gesprungen wird.

Hier mein Quelltext:


doInBackground:
PHP:
public class DownloadXMLFiles extends AsyncTask<URL, Integer, ArrayList<HashMap<String,String>>> {

        
        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(URL... urls) {

            XMLParser parser = new XMLParser();
            String xml = parser.getXMLFromUrl("http://testseide.de/info.xml");
            Document doc = parser.getDomElement(xml);

            ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
            NodeList nl = doc.getElementsByTagName(KEY_SYSTEM);

            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(KEY_UUID, doc.getElementsByTagName("uuid").toString());
                map.put(KEY_NAME, doc.getElementsByTagName("name").toString());
                map.put(KEY_JOBTITLE, doc.getElementsByTagName("jobtitle").toString());
                map.put(KEY_JOBINFO, doc.getElementsByTagName("jobinfo").toString());

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

            }
            return menuItems;
        }

onPostExecute:
PHP:
protected void onPostExecute(ArrayList<HashMap<String,String>> menuItems) {
             ListAdapter adapter = new SimpleAdapter(ListViewActivity.this, menuItems,
                    R.layout.list_item,
                    new String[]{KEY_NAME, KEY_JOBTITLE, KEY_JOBINFO}, new int[]{
                    R.id.name, R.id.jobtitle, R.id.jobinfo});

            ListView lv = getListView();

            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                    String jobtitle = ((TextView) view.findViewById(R.id.jobtitle)).getText().toString();
                    String jobinfo = ((TextView) view.findViewById(R.id.jobinfo)).getText().toString();

                    //Neue Oberfläche starten
                    Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                    in.putExtra(KEY_NAME, name);
                    in.putExtra(KEY_JOBTITLE, jobtitle);
                    in.putExtra(KEY_JOBINFO, jobinfo);
                    startActivity(in);
                }
            });

            }


Das Problem ist das diese Methode gar nicht aufgerufen wird.
Sprich meine App startet, aber in der listview wird nichts dargestellt.

könnt ihr meinen Fehler finden?
 
Sieht so aus, als ob die onPostExecute Methode außerhalb der DownloadXMLFiles Klasse ist. Einfach in die Klasse verschieben, dann sollte es funktionieren
 
Zuletzt bearbeitet:
Hi,

habe eben nachgeschaut und die Methode ist in der DownloadXMLFiles klasse also könnte es nicht daran liegen :/
 
Die signatur der onPostExecute ist nicht die richtige.

Soll: ArrayList<HashMap<String,String>>...

Ist: ArrayList<HashMap<String,String>>
 
  • Danke
Reaktionen: Lainio
vllt kommt ncihts von der seite

mach doch mal ein unit test und stell die werte selbst zur verfügung...

Google: "This method won't be invoked if the task was cancelled."

Der ursprüngliche Beitrag von 16:09 Uhr wurde um 16:13 Uhr ergänzt:

DieGoldeneMitte schrieb:
Soll: ArrayList<HashMap<String,String>>...

Ist: ArrayList<HashMap<String,String>>

Sind das nciht dieselben?
 
  • Danke
Reaktionen: Lainio
1. Wie Jaiel schon schrieb, bist Du sicher, dass Du überhaupt Daten erhälst?

2. Du hast für doInBackground ein @Override, aber für onPostExecute nicht? Hast Du das nur nich gepostet oder ist da wirklich keins? (Probier mal bei beiden Methoden mit @Override und ggf. mal ohne. Ich hab bei mir in einer App auch nen AsyncTask, läuft ohne Overrides.)

(3.) Mir kommt der ganze Aufbau merkwürdig vor. Du willst in onPostExecute den Adapter und die ListView + Listener initialisieren.
Ich hätte an dieser Stelle eigentlich nur die Ergebnisse des Tasks (menuItems) an die Activity zurückgeben und dort den bereits initialisierten Adapter mittels .notifyDataSetChanged() aktualisiert.
 
  • Danke
Reaktionen: Lainio
Jaiel schrieb:
Sind das nciht dieselben?

X... ist das selbe wie X[] und X ist nicht das selbe wie X[]

Deshalb überläd sein onPostExecute nicht die Methode, die die Runtime aufruft => nix passiert.
Wenn man die Methoden, mit denen man Methoden in der Elternklasse / im interface überladen will, mit @Override markiert, kann der Compiler es erkennen, wenn man sich bei der Signatur verhaut. Zum Lauf des Programms sind die Overrides -wie reallord feststellt- nicht nötig.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Lainio
erstmal danke für die vielen Antworten!

Ich habe es jetzt mal ohne und mal mit Overrides versucht jedoch passiert dasselbe, nämlich nichts.

Daten bekomme ich auf jedenfall das habe ich geprüft...

Also soll ich die Initialisierung aus der onPostExecute Methode rausnehmen und in die oncreate - Methode einfügen?
Wenn ja, dann versteh ich leider nicht wie ich in der Initialisierung des ListAdapters im parameter auf die menuitems der doInBackground methode zugreife?


Und allgemein gefragt:
Ist das überhaupt der richtige Weg eine XML-Datei in eine Listview zu laden?
 
Zuletzt bearbeitet:
Wurde überhaupt
Code:
 lv.setAdapter(adapter)
aufgerufen?
 
Dank eurer Hilfe klappt es nun!!

Ich danke euch!!!

So sieht dann der Quellcode bisher aus:

PHP:
    class DownloadXMLFiles extends AsyncTask<URL, Void, ArrayList<HashMap<String,String>> > {

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


        protected ArrayList<HashMap<String, String>> doInBackground(URL... urls) {

            XMLParser parser = new XMLParser();
            String xml = parser.getXMLFromUrl("http://testseide.de/info.xml");
            Document doc = parser.getDomElement(xml);


            NodeList nl = doc.getElementsByTagName(KEY_SYSTEM);

            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(KEY_UUID, parser.getValue(e,KEY_UUID));
                map.put(KEY_NAME, parser.getValue(e,KEY_NAME));
                map.put(KEY_JOBTITLE, parser.getValue(e,KEY_JOBTITLE));
                map.put(KEY_JOBINFO, parser.getValue(e,KEY_JOBINFO));

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

            }
            return menuItems;
        }

        

        protected void onPostExecute(ArrayList<HashMap<String,String>> menuItems) {
             ListAdapter adapter = new SimpleAdapter(ListViewActivity.this, menuItems,
                    R.layout.list_item,
                    new String[]{KEY_NAME, KEY_JOBTITLE, KEY_JOBINFO}, new int[]{
                    R.id.name, R.id.jobtitle, R.id.jobinfo});

            setListAdapter(adapter);
            }


        }


Dieser Teil steht jetzt in der onCreate-Methode der Activity:

PHP:
DownloadXMLFiles dlxmlf = new DownloadXMLFiles();
        dlxmlf.execute();

        ListView lv = getListView();

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                String jobtitle = ((TextView) view.findViewById(R.id.jobtitle)).getText().toString();
                String jobinfo = ((TextView) view.findViewById(R.id.jobinfo)).getText().toString();

                //Neue Oberfläche starten
                Intent in = new Intent(getApplicationContext(), ListMenuItemActivity.class);
                in.putExtra(KEY_NAME, name);
                in.putExtra(KEY_JOBTITLE, jobtitle);
                in.putExtra(KEY_JOBINFO, jobinfo);
                startActivity(in);
            }
        });
 

Ähnliche Themen

M
Antworten
8
Aufrufe
1.678
swa00
swa00
lordzwieback
  • lordzwieback
Antworten
15
Aufrufe
1.139
lordzwieback
lordzwieback
Zurück
Oben Unten