即使在onPostExecute完成后,AsyncTask也不会停止运行,并阻止GC的活动

时间:2011-08-23 19:48:22

标签: android android-asynctask

我的活动做了很多网络I / O,所以我启动了一个AsyncTask(因为你不能在UI线程上做网络I / O)来完成这个。我的问题是,当我调用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()中的

我检查了myAsyncTask的AsyncTask.Status并且它已经完成,但调试器仍然将任务显示为正在运行,当我调用finish()时myActivity永远不会终止,除非我使用AppKiller手动终止它。

我真正的问题是,我正在追逐一只红鲱鱼吗?那就是运行线程的存在会阻止活动被垃圾收集吗?

1 个答案:

答案 0 :(得分:4)

AsyncTask有一个线程池,所以即使你的工作完成,线程也不会被终止,这可能就是你在调试器中看到的。该池由finalize()关闭,因此在对象进行GC编辑之前不会关闭。您可能想要做的是确保您的AsyncTask不包含对活动的引用,反之亦然。您可以将它们分开onDestroy()

请记住,无论GC如何,如果Android内存不足,它只会终止您未使用的活动的过程,因此最终将回收内存。