Wypełnianie widoku listy w osobnym wątku

W działaniu ładuję wiersze widoku listy, co zajmuje dużo czasu, dlatego umieszczam to zadanie w osobnym wątku, aby umożliwić wyświetlanie progressDialog.

Robię co następuje

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();
        }
    };
};

Mam czasami błąd, który podnosi wyjątek IllegalStateException. Przede wszystkim byłem zaskoczony, ponieważ programowanie wątku w taki sposób zwykle robię w standardowych programach Java.

Błąd pojawia się tylko „czasami” i nie pojawia się podczas debugowania krok po kroku.

To doprowadziło mnie do przeszukiwania internetu i znalazłem kilka pytań w SO związanych z tym i muszę przyznać, że rzeczy nie są dla mnie jasne.

Jak nazywam notifyDataSetChanged () tylko wtedy, gdy wątek zakończył się, dlaczego czasami wywołuje wyjątek.

Czy ktoś może mnie potwierdzić, że ten sposób postępowania jest zły i że MUSZĘ użyć zadania asynchronicznego i być może wyjaśnić dlaczego?

Muszę mieć wyświetlony plik progressDialog, czy ktoś może mi podać prosty przykład AsyncTask zapełniający widok listy I wyświetlający progressDialog postępu zapełniania.

Dzięki

AKTUALIZACJA

jtanveer dał mi odpowiedź na pytanie asynctask. Teraz inni wskazywali, że zwolnienie nie jest w przewodniku, co poprawiam.

Zgodnie z artykułem podanym przez jtanveer na temat „Bezbolesne nawlekanie” mówią to

Android oferuje kilka sposobów uzyskania dostępu do wątku interfejsu użytkownika z innych wątków, z których jeden to HANDLER.

Czy ktoś wie, dlaczego umieszczenie odrzuconego w przewodniku nie rozwiązało mojego problemu? dla mnie listItem.add nie ma nic wspólnego z interfejsem użytkownika? Czy w tym punkcie się mylę?

Dla mnie, w moim kodzie jedynym interfejsem użytkownika jest adapter i progressdialog? Wszelkie komentarze lub wyjaśnienia są mile widziane.

OSTATNIA ODPOWIEDŹ

stjom dał roboczą odpowiedź na mój konkretny kod. Uruchamianie runOnUiThread w programie obsługi. Działa, ale jestem zaskoczony, ponieważ myślałem, że przewodnik został uruchomiony w wątku Ui ...

Dzięki wszystkim za wszystkie odpowiedzi.