Мне нужно, чтобы диалог прогресса «Загрузка» появлялся в начале упражнения, а затем отображал некоторые вещи после завершения загрузки. В моем резюме у меня есть код, подобный этому:
loadThread = true;
Thread showDetailsThread = new Thread() {
@Override
public void run() {
while (loadThread == true) {
Looper.prepare();
try {
dialog = ProgressDialog.show(myactivity.this, "", "Loading data...", true);
} finally {
handler.sendEmptyMessage(0);
}
Looper.loop();
}
}}; showDetailsThread.start();
Обработчик (не показан) отображает все, что мне нужно, и пока данные загружаются, диалог выполнения отображается, как и ожидалось. Проблема заключается в том, что после запуска анализатора памяти в Eclipse я понял, что каждый раз, когда я посещаю это действие, он порождает новый экземпляр всего, созданного обработчиком в новом потоке, не разрушая предыдущий. Из-за того, что несколько экземпляров действия выполнялись вечно в нескольких потоках, мне в итоге не хватило памяти.
Вот что я не понимаю. У меня сложилось впечатление, что, учитывая приведенный выше пример, обработчик будет работать в главном потоке пользовательского интерфейса, а не в новом потоке, содержащем диалог. Единственное, что должно существовать в новом потоке - это диалоги процесса, и диалог немедленно закрывается в начале обработчика (не показан), что должно остановить поток, верно? Почему эти потоки создаются и работают бесконечно? Кстати, у меня есть «loadThread = false;» в моей onpause, ondestroy и onstop в попытке остановить поток после перехода к другому действию, но это не работает.
Если я просто вызываю обработчик напрямую, а не запускаю его в showdetailsThread finally {}, все в порядке и утечки нет, но мне действительно нужно, чтобы диалоги выполнения появлялись во время 2-секундной задержки, возникающей во время загрузки. *
Вероятно, есть лучший способ сделать это в любом случае. Любая помощь с благодарностью.