在後臺執行某些操作,然後更新UI在Android中很難正確實現。它設計得很糟糕。典型的例子是一個AsyncTask,它從Web上獲取某些內容並顯示結果。這裏有兩個問題:Cancombcomb Loaders可以解決AsyncTask + UI更新的問題嗎?
AsyncTask有Activity的引用(因爲它需要更新它的UI)。屏幕方向更改後,活動重新啓動。但AsyncTask仍然引用舊的已銷燬的Activity,因此它無法更新新Activity的UI。
這可能會導致OutOfMemoryException。想象一下,你有一個有很多位圖的Activity並啓動一些AsyncTask。您按BACK(活動已完成),但AsyncTask仍在運行,並且由於它引用了活動,位圖活動仍在內存中。重複此操作(啓動「活動」和「返回」),遲早會關閉某個部隊。
這可以解決,但它太複雜了。在一個Activity中,我有3個不同的AsyncTasks,每個可以同時在幾個實例中運行。正確實施這個令人沮喪。代碼變得很難理解和調試。
可以Honeycomb Loaders以某種方式解決這個問題?有沒有一種方法可以在Honeycomb Android版本中使用它們?
謝謝,但在這個例子中,只解決了問題1 - AsyncTask中的活動字段應該在onDestroy()中消失。我使用自己的AsyncTask和Activity的子類來幫助我解決問題1和2,但它仍然太複雜。做異步工作應該很容易。 – fhucho 2011-02-23 22:01:44
問題2也解決了:每次創建新的Activity時,AsyncTask中的引用都會更新,以便它指向這個新的Activity。所以沒有什麼是引用舊的活動,它可以被GCed。 – 2011-02-23 22:25:23
@Mike:感謝一個偉大的鏈接!我將在未來的項目中使用它。 – 2011-02-23 22:26:29