Заполнение списка в отдельной теме

В упражнении я загружаю строки списка, что занимает много времени, поэтому я помещаю эту задачу в отдельный поток, чтобы можно было отображать progressDialog.

Я делаю следующее

<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>

У меня иногда есть ошибка, которая вызывает исключение IllegalStateException. Прежде всего, я был удивлен, потому что программирование потока, как это я обычно делаю в стандартных программах Java.

Ошибка появляется только & quot; иногда & quot; и он не появляется при пошаговой отладке.

Это привело меня к поиску в Интернете, и я нашел в SO несколько вопросов, связанных с этим, и я должен признать, что вещи не ясны для меня.

Поскольку я вызываю notifyDataSetChanged () только после завершения потока, почему он иногда вызывает исключение.

Может ли кто-нибудь подтвердить мне, что этот способ неправильный, и что я ДОЛЖЕН использовать асинхронную задачу и, возможно, объяснить мне, почему ???

Мне нужно, чтобы отображался progressDialog, может кто-нибудь дать мне простой пример AsyncTask, заполняющего представление списка И отображающий progressDialog заполняющего прогресса.

Спасибо

UPDATE

Jtanveer дал мне ответ на асинктивный вопрос. Теперь другие отметили, что увольнение не в обработчике, что я исправляю.

Согласно статье, опубликованной jtanveer на тему «Безболезненная резьба» они говорят, что

Android предлагает несколько способов доступа к потоку пользовательского интерфейса из других потоков, одним из которых является HANDLER.

Кто-то знает, почему помещение уволенного в обработчик не решило мою проблему? для меня listItem.add не имеет ничего общего с пользовательским интерфейсом? Я не прав в этом вопросе?

Для меня в моем коде единственный интерфейс это адаптер и progressdialog? Любые комментарии или объяснения приветствуются.

FINAL ANSWER

stjom дал рабочий ответ для моего конкретного кода. Запуск runOnUiThread в обработчике. Это работает, но я удивлен, потому что я думал, что обработчик был запущен в потоке пользовательского интерфейса ...

Спасибо всем за все ваши ответы.

Ответы на вопрос(3)

Ваш ответ на вопрос