2011-11-16 18 views
0

我對AsyncTask有些擔心,我在閱讀文檔時無法弄清楚。AsyncTask對活動流程的懷疑

我的app主Activity在創建時運行幾個AsyncTask。這些AsyncTask主要是從數據庫下載數據或檢索數據。

  1. 如果我去一個不同的活動,將創建在 這個AsyncTask這個繼續執行?或者他們會停止工作,並讓 任務完成一半?如果是這樣,當他們回到 這個活動時他們會不知何故地繼續?
  2. 爲了從 啓動一個運行AsyncTask的活動,我需要AsyncTask的 之一完全執行。我如何設置這個約束?你能告訴我 這個的一些示例代碼嗎?

感謝

回答

0

如果我去一個不同的Activity,這個AsyncTask的創建會繼續執行嗎?或者他們會停止工作並將任務完成一半?如果是這樣,當他們回到這個活動時,他們會繼續嗎?

是的,它會繼續運行。這可能是一把雙刃劍,因爲它通常會保留Activity實例,導致它超出了其回調的範圍,這並不理想。如果您正在運行的任務與「活動」本身沒有相同的生命週期需求,則最好放置到「服務」中。

爲了啓動運行AsyncTask的活動之一,我需要一個AsyncTask完全執行。我如何設置這個約束?你能告訴我一些這樣的示例代碼嗎?

有太多的方法可以做到這一點,很多取決於您的應用程序的體系結構,以提供特定的示例代碼......但這裏有一些更高層次的想法。由於AsyncTask在任務執行完成時在主線程(onPostExecute)上提供了一個簡單的回調方法,因此您可以在該點設置一個標誌。或者,也許只需檢查AsyncTask從活動啓動的任何代碼中檢索的任何數據的存在。同樣,服務將爲此提供良好的環境,因爲在前進之前,多個活動可以連接到服務並檢查任務狀態。

根據您的應用程序,另一種選擇是將任務的結果轉儲到ContentProvider中。 ContentProviders包含一個很好的界面,可以在不訴諸全局廣播意圖的情況下通知觀察者所做的更改。

HTH

0

香港專業教育學院完成使用意圖和廣播接收機之前,類似這樣的東西。

如果您在完成異步任務時發送全局或應用程序範圍的意圖,那麼如果您正確地構建它們,就很容易讓接收者選取它。通過在將新活動推入堆棧時創建接收器,並在活動暫停時關閉接收器,總會有一個接收器用於捕獲該意圖,並被告知(例如:數據是從數據庫)並採取行動。

如果您嘗試啓動需要該數據的活動,則可以在尚未找到該意圖的情況下否決該活動的創建,或創建該活動並讓其放置進度欄或其他活動數據完成下載,然後讓它的接收器在其到達時按照意圖進行操作。

希望這會有所幫助。