Вы не можете показывать диалоги нигде, кроме потока пользовательского интерфейса.На самом деле это хорошая новость: вы бы потратили бесконечное время на отладку невоспроизводимых проблем, если бы могли!
Что вам нужно сделать, так это, как вы уже догадались, отчитаться из фонового потока перед вашими внешними действиями,и пусть они выполняют работу с пользовательским интерфейсом.
Прежде чем фоновый поток начнет свою работу, передайте ему интерфейс обратного вызова:
public interface SomeListener {
public void onSomethingDone(Object result);
}
Допустим, вы хотите запустить этот поток и уведомить его.вы возвращаетесь всякий раз, когда у него есть данные (в отличие от запроса данных каждый раз).Базовый (не отвлеченный, некрасивый) подход будет следующим:
/* In your Activity */
private Handler mHandler = new Handler();
public void startBackgroundWork() {
new WorkingThread(new SomeListener() {
public void onSomethingDone(Object result) {
mHandler.post(new Runnable() {
public void run() { showMyDialog(result); }
}
}
}).start();
}
И затем, конечно,
public class WorkingThread extends Thread {
private SomeListener mListener;
public WorkingThread(SomeListener listener) {
mListener = listener;
}
public void run() {
/* do some work */
mListener.onSomethingDone(result);
}
}
Таким образом, ваш поток вызывает функцию, которая обеспечивает диалогпоказывается из цепочки действий.
Однако могут возникнуть другие проблемы.Это не на 100% правильный способ борьбы с этим.См. Этот блог для получения дополнительной информации:
http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/