AsyncTask не прекратит работу даже после того, как onPostExecute завершит работу и заблокирует GC'd активность - PullRequest
0 голосов
/ 23 августа 2011

Моя деятельность выполняет много операций сетевого ввода-вывода, поэтому я запускаю AsyncTask (поскольку вы не можете выполнить сетевой ввод-вывод в потоке пользовательского интерфейса), чтобы выполнить это. Моя проблема заключается в том, что когда я вызываю метод finish () для выхода из приложения, приложение никогда не собирается сборщиком мусора и продолжает работать в фоновом режиме. Я предполагаю (возможно, неправильно), что задача никогда не выполняется GC, потому что AsyncTasks все еще работают, как показывает окно отладки Eclipse. Я прочитал все, что я могу найти по этому вопросу, и это кажется проблемой без решения.

Вот подробности:

в OnCreate я создаю MessageHandler следующим образом:

mMessageHandler = new Handler()
{
@Override
public synchronized void handleMessage(Message msg)
{
  switch( (int)msg.arg1)
  {
         case kMessageDoSomething:
           doSomething();
           break;
                          .
                          .

У меня есть класс для каждого AsyncTask, например, в myAsyncTask.java

public class myAsyncTask extends AsyncTask<Void, Object, Object>
{
    @Override
protected Object doInBackground(Void... params)
{
         doSomeNetworkIO();
         return null;
    }

@Override
protected void onPostExecute(Object result)
{
    super.onPostExecute( result );
    msg = new Message();
    msg.arg1 = MyActivity.getInstance().kMessageDoSomething;
    MyActivity.getInstance().mMessageHandler.sendMessage( msg );
    }

и обратно в myActivity

new myAsyncTask().execute();

в методе doSomthing () я проверяю AsyncTask.Status myAsyncTask, и он ЗАВЕРШАЕТСЯ, однако отладчик по-прежнему показывает задачу как выполняющуюся, и когда я вызываю метод finish (), myActivity никогда не завершается, пока я не использую AppKiller, чтобы убить его вручную.

Мой настоящий вопрос здесь, я гоняюсь за красной сельдью? то есть присутствие запущенных потоков мешает сборке мусора для активности?

1 Ответ

4 голосов
/ 24 августа 2011

AsyncTask имеет пул потоков, поэтому, даже если ваша работа завершена, потоки не прерываются, это, вероятно, то, что вы видите в отладчике.Пул закрывается на finalize(), поэтому он не закрывается, пока объект не будет GC-ed.Что вы можете сделать, это убедиться, что AsyncTask не содержит ссылку на действие, и наоборот.Вы можете отсоединить их onDestroy().

Имейте в виду, что независимо от GC, если у Android недостаточно памяти, он просто прекратит процесс вашей неиспользуемой активности, поэтому память будет в конечном итоге восстановлена.

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