Android 性能模式第五季的第八集,之前因為沒有使用過 Loader 所以暫時跳過,住院的這些日子,接觸了 Loader,發現它真的很好用,接下來,進入視頻翻譯,地址如下:
當 Activity 不在活躍,我們應當如何處理正在進行的線程工作呢?
加載器可以解決這個問題。
目前為止,你可以看 App 中的 Activity 都可以被隨時創建以及銷毀,無論是響應用戶操作還是因為 Android 需要資源。
這就為線程工作提出了一個問題,因為它的工作可能超出了 Activity 的生命周期。
當你的 Activity 被銷毀,但你的線程還依然在運行并持有一些 View 的引用,等待任務結束后對他們做些更新。
如果 Activity 在線程任務之前結束可能會發生一些問題。
首先,因為它還強引用著 View,Activity 對象將被保留在內存中,直到線程任務終于完成。
這就是內存泄漏(內存泄漏指的是由于某些原因未能釋放已經不再使用的內存),而這可能導致 App 內容不足,最終導致崩潰。
其次,任務完成之后更新這些 View 是浪費的,因為他們已經不再可見。
最后,你可能需要重復這個任務才能使得 VIew 更新。
你應該讓線程工作正確響應 Activity 的生命周期,從而避免這些問題。
這時候你應該使用 Loader。
Loader 是一種對于 Activity 生命周期的內部明智的用法(這個翻譯的好差...),你可以確保每次工作都在正確的地方結束。
所以 Loader 可以有效的防止內存泄漏,可以正確的更新視圖,沒有不必要的重復。
讓我們來看看它如何工作,你可以在 Activity 中創建一個 LoaderManager 實例,來替代 AsyncTask 或者其他線程上的任務。
將工作發送到 LoaderManager 并且它將確保當 Activity 配置改變時你的任務依然處理得當。
LoaderManager 也會將任務結果緩存起來,所以不必重復。
現在如果一個帶有正在運行加載器的 Activity 正在被彈出棧,且不會再進入任務棧中,那么這個正在運行的任務會發生什么呢?
這種情況下 LoaderManager 會在你的代碼中進行回調,告訴你這個結果永遠不會被使用。
你可以使用這個回調終止這個任務,清理和繼續其他任務進而不在浪費任何資源。
值得注意的是, Loader 是針對 Activity 的,因此,它為你提供了一個堅實的框架,用于將視圖與工作線程分開,并最大限度的減少在 Activity 生命周期中的重復工作。
Loader 的缺點是要使用相當多的額外代碼,從而將其正確的集成到你的 App 中。
這就是本次視頻內容,翻譯水平還有待提升(主要是翻譯成人話),我會繼續努力的!