2013-10-28 75 views
4

我有一個活動,在該活動中,我使用asyctask的子類與服務器同步後端服務器。異步任務在App終止時停止(onDestroyed被調用)

鑑於這是一項網絡任務,可能需要幾秒鐘的時間。我擔心發生以下情況。

活動開始,每當asynctask開始運行時,它都會啓動。 onPrexecute()被調用,執行並結束。比doInBackground()被調用,並且這樣做,然而,只是當方法被執行時,用戶按下主頁按鈕並從最近的應用程序中滑動應用程序。 (這當然會導致應用程序終止,並且所有的onDestroy方法都會被調用活着的活動。(糾正我,如果我錯了這個))。

在我的onPostExecute()方法中,我將數據插入到數據庫並更新視圖。 但是由於應用程序'終止',onPostExecute()方法從不運行。

我的問題是:

  1. 當用戶按下home鍵,並得到了應用,並揮筆應用,是doInBackground停止在那一刻?也就是說,它在中間被切斷,不會繼續它的作用?
  2. 我將從服務器獲取並放入數據庫的數據會發生什麼?建議將數據放入doInBackground中的數據庫中嗎?

回答

1
  1. 當用戶按下「家」,你Activtiy將暫停,但doInBackground不會,但可能會在系統感覺就像是或可能不會被系統終止。活動的onPause將被調用。你的Asynctask doInBackGround不會停止。它將繼續運行,直到系統終止您的應用程序進程。
  2. 是的,Db操作可能需要很長時間。建議放入doInBackground,因爲它在另一個線程上運行。 onpre/onpostexcute在主線程上運行。如果您擔心繫統可能會終止您的數據庫操作的一半,您應該設置Transcation,並且只有當您完成時,才調用commit。

看看這個post,我測試過了。

1
  1. 不,它不停止。

  2. 這是relly更好地把它放到數據存儲某種然後用它

工作,它始終是更好地爲這些目標使用的服務。 AsyncTasks在這裏不適合。請您的服務部門完成這項工作,然後您可以按照您的意願啓動或退出活動。

3
  1. 的AsyncTask是一個後臺任務將繼續運行,即使當應用程序被關閉,並onDestroy()被調用。當任務輸入onPostExecute()並嘗試更新與其綁定的活動相關聯的任何視圖時,問題就會出現,因爲該活動不再存在。如果您擔心這一點,我所做的一件事就是在調用活動中保留對該AsyncTask的引用,然後調用方法myAsyncTaskReference。 cancel(true)在呼叫活動的onDestroy()中取消它。

  2. 是的,我會將DB操作放在doInBackground()方法中,因爲它在單獨的線程中在後臺運行,並且不需要引用應用程序活動。

您是否考慮過使用此類服務​​?我強烈推薦IntentService,這是服務的一個子類,專門設計用於在後臺執行單個任務(類似於AsyncTask),然後在完成後自行終止。這很容易實現,通常只涉及覆蓋一種方法 - onHandleIntent() - 服務啓動時調用。

它可以處理您的所有數據庫操作,並且它沒有提及任何活動,所以您在#1中擔心的問題永遠不會發生。如果您需要更新視圖,您可以讓IntentService在完成後生成廣播,並且您的活動可以註冊該廣播並在接收到廣播時相應地更新其視圖。如果廣播發送後你的活動不再存在,那麼它就無關緊要,也不會失敗。

+0

但不會IntentService(就像asynctask),只要應用程序被殺死,就停止,所以它不會甚至能夠發射廣播。 – tony9099

+1

不,不會停止。 IntentService與調用活動完全分離,所以它將繼續運行,直到它完成任務,即使啓動它的應用程序被終止。這就是爲什麼它對於數據庫操作來說非常完美,因爲它仍然會將所有接收到的數據寫入數據庫。發送廣播只是爲了通知調用活動服務已完成,並且應該更新它的視圖 - 所以如果活動不再運行,則無論如何不重要。 – physphil

+0

編號請參閱我答案中的鏈接。我已經測試過了。 – wtsang02

1

如果從最近的堆棧中刷卡應用程序,它相當於關閉應用程序,因此它會殺死與該進程相關的所有任務,因此異步任務也將被android系統殺死。 (甚至意圖服務也被殺死)

它也依賴於設備。製造商自定義從最近的行爲中刪除應用程序