2011-10-04 49 views
5

什麼是使用asynctasks的正確方法? 假設用戶輸入一個活動,並且asynctask開始,並且在asynctask運行時,用戶決定導航到另一個頁面。Android - 正確使用AsyncTasks的方法?

  • anynctask會發生什麼?它會在完成之前運行嗎?
  • 我是否負責以某種方式阻止這個asynctask?

回答

5

asynctask將繼續運行。 asynctask可能會在Android操作系統嘗試恢復內存不足時運行。如果你不關心異步任務可能無法完成,那麼也許這並不重要,但這是不好的做法。另外,也許當異步任務根據你如何存儲/處理結果而死亡時,你可能會嘗試編輯該活動中不再存在的活動/對象,從而導致nullpointerexceptions和其他不好的事情。 正確這樣做的方法是從您的活動開始服務並從服務啓動一個asynctask。您應該按照這個演講在谷歌IO 2010給介紹的設計模式之一:

Android REST Client Design Patterns

那說話有趣,但很難跟蹤並沒有給出代碼,所以這裏我用了一個很好的學習教程這東西:

Downloading Data with Services

此外,Android將管理您的非同步任務的線程池適合你(我相信這將開始殺害他們,當你在過程中有超過5),你不必殺了他們。看看這裏的答案:

How AsyncTasks die

0

好生病嘗試要快:

  • 你必須負責,如果不這樣做產生負面影響您的程序停止的AsyncTask。閱讀this

  • 你的AsyncTask將通過其生命做onPreExecute() - doInBackground(參數...) - 使用壽命的AsyncTask

  • 的AsyncTask的onPostExecute(結果) - 端已經完成,以只執行一次,然後如果你想執行它另一個時間,你必須創建一個又一個
0
  1. 是的,的AsyncTask將繼續運行,如果你沒有在導航停止到另一個活動。即使設備的配置發生變化(例如旋轉),它也會繼續運行。如果你想對postExecute()做一些對UI有影響的事情,那麼你必須確保在這個方法中你修改的UI小部件的引用在循環後有效,當Activity被重新創建時。

  2. 是的,如果你不需要它,你有責任停止(也就是說,.cancel())你的AsyncTask。但請注意,處於執行過程中的AsyncTask不會因爲您調用了.cancel()而停止。它將繼續運行,但是當任務完成時,它的postExecute()方法將不會被調用。