我的活动做了很多网络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手动终止它。
我真正的问题是,我正在追逐一只红鲱鱼吗?那就是运行线程的存在会阻止活动被垃圾收集吗?
答案 0 :(得分:4)
AsyncTask有一个线程池,所以即使你的工作完成,线程也不会被终止,这可能就是你在调试器中看到的。该池由finalize()
关闭,因此在对象进行GC编辑之前不会关闭。您可能想要做的是确保您的AsyncTask不包含对活动的引用,反之亦然。您可以将它们分开onDestroy()
。
请记住,无论GC如何,如果Android内存不足,它只会终止您未使用的活动的过程,因此最终将回收内存。