Poblando listview en hilo separado

En una actividad que carga filas de una vista de lista que lleva mucho tiempo, por lo tanto, coloco esta tarea en un hilo separado para permitir mostrar un diálogo de progreso.

Hago lo siguiente

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

A veces tengo un error que genera una excepción IllegalStateException. En primer lugar, me sorprendió, porque la programación de este tipo de hilos es lo que suelo hacer en los programas estándar de Java.

El error aparece solo "a veces" y no aparece cuando se realiza la depuración paso a paso.

Esto me llevó a buscar en la web y encontré algunas preguntas en TAN relacionadas con esto y debo admitir que las cosas no están claras en mi mente.

Como llamo a notifyDataSetChanged () solo cuando el subproceso finalizó, ¿por qué a veces genera una excepción?

¿Alguien puede confirmarme que esta forma de hacer está mal, y que DEBO usar una tarea asíncrona y quizás explicarme por qué?

Necesito que se muestre un diálogo de progreso. ¿Puede alguien darme un ejemplo sencillo de AsyncTask para completar una vista de lista Y mostrar un diálogo de progreso del progreso de la población?

Gracias

ACTUALIZAR

jtanveer me dio la respuesta a la pregunta de asynctask. Ahora, los otros señalaron que el despido no está en el controlador, que yo corrijo.

De acuerdo con el artículo dado por jtanveer en "Subprocesos sin dolor", dicen que

Android ofrece varias formas de acceder al subproceso de la interfaz de usuario desde otros subprocesos, uno de los cuales es HANDLER.

¿Alguien sabe por qué poner el descargado en el controlador no resolvió mi problema? para mí listItem.add no tiene nada que ver con la interfaz de usuario? ¿Estoy equivocado en ese punto?

Para mí, en mi código, ¿la única IU es adaptable y progressdialog? Cualquier comentario o explicación es bienvenida.

RESPUESTA FINAL

stjom dio una respuesta de trabajo para mi código específico. Ejecutando el runOnUiThread en el controlador. Está funcionando pero me sorprende porque pensé que el controlador se ejecutó en el subproceso de Ui ...

Gracias a todos por todas vuestras respuestas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta