Моя деятельность выполняет много операций сетевого ввода-вывода, поэтому я запускаю 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, чтобы убить его вручную.
Мой настоящий вопрос здесь, я гоняюсь за красной сельдью? то есть присутствие запущенных потоков мешает сборке мусора для активности?