Listview in separaten Thread füllen

In einer Aktivität lade ich Zeilen einer Listenansicht, die viel Zeit in Anspruch nimmt. Daher habe ich diese Aufgabe in einen separaten Thread gestellt, damit ein progressDialog angezeigt werden kann.

Ich mache folgendes

<code>private void doMyStuff() {
    listItems.clear();
    progressDialog.show();

    new Thread(new Runnable() {
        @Override
        public void run() {                
            for () {
                listItems.add(something to add);
            }
        handler.sendEmptyMessage(0);
        progressDialog.dismiss();
        }
    }).start();
}

private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if (msg.what == 0) {
            adapter.notifyDataSetChanged();
        }
    };
};
</code>

Ich habe manchmal einen Fehler, der eine IllegalStateException auslöst. Zunächst war ich überrascht, denn so einen Thread zu programmieren ist das, was ich normalerweise in Standard-Java-Programmen mache.

Der Fehler tritt nur "manchmal" auf und tritt beim schrittweisen Debuggen nicht auf.

Dies führte mich dazu, im Internet zu suchen, und ich fand einige Fragen in SO, die damit zusammenhängen, und ich muss zugeben, dass die Dinge für mich nicht klar sind.

Wie ich das notifyDataSetChanged () nur aufrufe, wenn der Thread beendet ist, warum es manchmal eine Ausnahme auslöst.

Kann mir jemand bestätigen, dass diese Vorgehensweise falsch ist, und dass ich eine asynchrone Aufgabe verwenden MUSS und mir vielleicht erklären muss, warum ???

Ich muss ein progressDialog anzeigen lassen. Kann mir jemand ein einfaches Beispiel für AsyncTask geben, das eine Listenansicht auffüllt UND ein progressDialog des Auffüllfortschritts anzeigt?

Vielen Dank

AKTUALISIEREN

jtanveer gab mir die Antwort auf die asynchrone Frage. Nun wiesen die anderen darauf hin, dass die Entlassung nicht im Handler liegt, was ich korrigiere.

Laut dem Artikel von jtanveer über "Schmerzloses Einfädeln" sagen sie das

Android bietet verschiedene Möglichkeiten, von anderen Threads, darunter HANDLER, auf den UI-Thread zuzugreifen.

Weiß jemand, warum das Einsetzen des Entlassenen in den Handler mein Problem nicht gelöst hat? für mich hat listItem.add nichts mit UI zu tun? Irre ich mich in diesem Punkt?

Für mich ist in meinem Code die einzige Benutzeroberfläche Adapter und Progressdialog? Jeder Kommentar oder jede Erklärung ist willkommen.

ENDGÜLTIGE ANTWORT

stjom gab eine funktionierende Antwort auf meinen spezifischen Code. Ausführen von runOnUiThread im Handler. Es funktioniert, aber ich bin überrascht, weil ich dachte, dass der Handler im Ui-Thread ausgeführt wurde ...

Vielen Dank an alle für all eure Antworten.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage