2011-02-23 48 views
13

在後臺執行某些操作,然後更新UI在Android中很難正確實現。它設計得很糟糕。典型的例子是一個AsyncTask,它從Web上獲取某些內容並顯示結果。這裏有兩個問題:Cancombcomb Loaders可以解決AsyncTask + UI更新的問題嗎?

  1. AsyncTask有Activity的引用(因爲它需要更新它的UI)。屏幕方向更改後,活動重新啓動。但AsyncTask仍然引用舊的已銷燬的Activity,因此它無法更新新Activity的UI。

  2. 這可能會導致OutOfMemoryException。想象一下,你有一個有很多位圖的Activity並啓動一些AsyncTask。您按BACK(活動已完成),但AsyncTask仍在運行,並且由於它引用了活動,位圖活動仍在內存中。重複此操作(啓動「活動」和「返回」),遲早會關閉某個部隊。

這可以解決,但它太複雜了。在一個Activity中,我有3個不同的AsyncTasks,每個可以同時在幾個實例中運行。正確實施這個令人沮喪。代碼變得很難理解和調試。

可以Honeycomb Loaders以某種方式解決這個問題?有沒有一種方法可以在Honeycomb Android版本中使用它們?

回答

7

是的,從我的經驗Loader他們似乎解決了人們與AsyncTasks和配置更改的常見問題。

我認爲谷歌說碎片靜態庫也包括Loaders,所以是的,當庫被釋放時它們也應該向後工作。

4

這並不回答您關於蜂窩裝載機的問題,但以下鏈接具有可輕鬆處理AsyncTasks方向更改的模式。

http://evancharlton.com/thoughts/rotating-async-tasks/

即使世界上有一些其他偉大的職位也是如此。

更新:由於OP在註釋中指出,這隻適用於配置(方向)更改,但在使用BACK按鈕並通過主菜單或任務列表重新啓動時不起作用。

如果您一次需要一個AsyncTask,那麼您可以在Activity中使用AsyncTask的靜態引用。另一個選項是保存對應用程序的引用。

然後,當一個新的活動開始時,你看是否有一個AsyncTask正在運行,並將其自身設置爲當前活動(通過AsyncTask上的setter)。一定要同步訪問AsyncTask中的Activity。

+0

謝謝,但在這個例子中,只解決了問題1 - AsyncTask中的活動字段應該在onDestroy()中消失。我使用自己的AsyncTask和Activity的子類來幫助我解決問題1和2,但它仍然太複雜。做異步工作應該很容易。 – fhucho 2011-02-23 22:01:44

+0

問題2也解決了:每次創建新的Activity時,AsyncTask中的引用都會更新,以便它指向這個新的Activity。所以沒有什麼是引用舊的活動,它可以被GCed。 – 2011-02-23 22:25:23

+0

@Mike:感謝一個偉大的鏈接!我將在未來的項目中使用它。 – 2011-02-23 22:26:29

相關問題