2011-08-23 73 views
0

我的活動執行了很多網絡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手動殺死它。

這裏我真正的問題是,我在追着一隻紅鯡魚嗎?那是否存在正在運行的線程會阻止活動被垃圾收集?

+0

您能澄清一下您是否期望應用程序根據您的第一段獲取垃圾回收,還是期望您的活動能夠按照您的最後一次獲得GCd?活動應該是GCd,除非某些東西在某個地方持有強烈的引用(這將是一個錯誤)。完成活動後,您不應該期望應用程序獲得GCd。有時可能,但通常不會。 – emmby

+0

可以定義什麼是強引用,例如我的AsyncTask包含** MyActivity.getInstance()**是否構成強引用? **最終MyActivity活動= MyActivity.getInstance()**? – user330844

+0

嗨user330844。強引用是任何普通的java引用。強引用的替代方法通常是一個弱引用,您可以使用[java.lang.ref.WeakReference](http://download.oracle.com/javase/1,5.0/docs/api/java/lang /ref/WeakReference.html)。還有其他選擇,例如軟件或幻影引用,但通常較弱的是您在Android上尋找的內容。 – emmby

回答

4

AsyncTask有一個線程池,所以即使你的工作完成了,線程並沒有被終止,這可能是你在調試器中看到的。游泳池由finalize()關閉,所以在對象進行GC編輯之前它不會關閉。你可能想要做的是確保你的AsyncTask沒有參考活動,反之亦然。你可以將它們分開onDestroy()

請記住,無論GC如果Android的內存不足,它只會終止未使用的活動的進程,因此內存將最終被回收。

+0

請注意,onDestroy不保證被調用。另外,依賴於android來終止你的進程並不理想,除了最簡單的情況。如果您的應用有任何其他活動或服務仍處於活動狀態,那麼android將無法回收已完成活動泄漏的內存,因爲這樣做會導致您的活動活動/服務中斷。 – emmby

相關問題