我的活動執行了很多網絡I/O,因此我啓動了一個AsyncTask(因爲您無法在UI線程上執行網絡I/O )來完成這一點。我的問題是,當我調用finish()來退出我的應用程序時,該應用程序從未被垃圾收集,並繼續在後臺運行。我假設(也許不正確)該任務從未GC'd,因爲AsyncTasks仍在Eclipse調試窗口顯示我正在運行。我已經閱讀了我能找到的所有內容,而且沒有解決方案似乎是個問題。即使在onPostExecute完成並阻止GC'd的活動之後,AsyncTask也不會停止運行
下面是詳細信息:在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手動殺死它。
這裏我真正的問題是,我在追着一隻紅鯡魚嗎?那是否存在正在運行的線程會阻止活動被垃圾收集?
您能澄清一下您是否期望應用程序根據您的第一段獲取垃圾回收,還是期望您的活動能夠按照您的最後一次獲得GCd?活動應該是GCd,除非某些東西在某個地方持有強烈的引用(這將是一個錯誤)。完成活動後,您不應該期望應用程序獲得GCd。有時可能,但通常不會。 – emmby
可以定義什麼是強引用,例如我的AsyncTask包含** MyActivity.getInstance()**是否構成強引用? **最終MyActivity活動= MyActivity.getInstance()**? – user330844
嗨user330844。強引用是任何普通的java引用。強引用的替代方法通常是一個弱引用,您可以使用[java.lang.ref.WeakReference](http://download.oracle.com/javase/1,5.0/docs/api/java/lang /ref/WeakReference.html)。還有其他選擇,例如軟件或幻影引用,但通常較弱的是您在Android上尋找的內容。 – emmby