2011-08-12 110 views
0

我已經創建了一個從數據庫加載消息歷史記錄,然後顯示它在設備屏幕上的AsyncTask:的AsyncTask不會停止

private void loadHistoryFromDB(Date lastUpdateDate) 
    { 
    final class DBAsyncTask extends AsyncTask<Void, Void, List<XMPPMessage>> 
    { 
     @Override 
     protected List<XMPPMessage> doInBackground(Void... arg0) 
     { 
      List<XMPPMessage> messages = null; 
      try 
      { 
       messages = PersistenceManager.getXMPPMessagesFromDB(userInfo, 0, messagingActivity); 
      } 
      catch (SQLException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (LetsDatabaseException e) 
      { 
       e.printStackTrace(); 
      } 
      return messages; 
     } 

它似乎做工精細,但在被執行後,它的葉子2個正在運行的線程,因此我無法完成該活動。我該如何解決它?

回答

2

只要您的任務正確執行(退出onPostExecute),這不應該是您不必擔心的問題。一旦執行,AsyncTask線程將堅持以線程池或單線程的形式進行重用,具體取決於平臺版本。這是正常行爲 - 它們最終將被清理/重用。

0

首先,確保您在重寫的方法調用的頂部調用super.doInBackGround()

如果不是這樣,那很可能是因爲您正在維護與數據庫的連接。

也就是說,您仍然在數據庫上建立了鎖。

看看你是否可以明確解鎖數據庫,這可能會解決你的問題。

你可以把它放在onPostExecute()方法中。

+2

AsyncTask.doInBackground()是一個抽象方法,所以現在的方式來調用它。 –

0

這個問題很可能是由於圍繞AsyncTask的取消方法引起的混淆。

您需要將後臺任務分解爲可循環段,然後在每次循環迭代開始執行任務之前,您需要檢查任務是否被取消,以及是否需要中斷循環。似乎沒有任何其他方式阻止AsyncTask執行。

我已經張貼了詳細的指南,這個問題在這裏的代碼示例:

http://tpbapp.com/android-development/android-asynctask-stop-running-cancel-method/