Утечка памяти Android: несколько экземпляров активности в нескольких потоках - PullRequest
2 голосов
/ 26 февраля 2011

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

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-секундной задержки, возникающей во время загрузки. *

Вероятно, есть лучший способ сделать это в любом случае. Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Теперь утечки памяти больше нет.Мне нужно было создать обработчик в новом потоке, который будет связываться с Looper (где-то между Looper.prepare () и Looper.loop ():

threadKillerHandler = new Handler();

и затем вызватьquit () в обработчике петлителя, когда я закончу с потоком (в моем случае это onDestroy):

threadKillerHandler.getLooper().quit();

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

0 голосов
/ 26 февраля 2011

Я бы предложил использовать AsynchTask вместо того, как вы это делаете.Это преобразует несколько появившихся экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...