Android 性能模式第五季的第八集,之前因為沒有使用過 Loader 所以暫時跳過购披,住院的這些日子杖挣,接觸了 Loader,發(fā)現(xiàn)它真的很好用刚陡,接下來惩妇,進(jìn)入視頻翻譯,地址如下:
當(dāng) Activity 不在活躍筐乳,我們應(yīng)當(dāng)如何處理正在進(jìn)行的線程工作呢歌殃?
加載器可以解決這個問題。
目前為止蝙云,你可以看 App 中的 Activity 都可以被隨時創(chuàng)建以及銷毀氓皱,無論是響應(yīng)用戶操作還是因為 Android 需要資源。
這就為線程工作提出了一個問題勃刨,因為它的工作可能超出了 Activity 的生命周期波材。
當(dāng)你的 Activity 被銷毀,但你的線程還依然在運行并持有一些 View 的引用身隐,等待任務(wù)結(jié)束后對他們做些更新各聘。
如果 Activity 在線程任務(wù)之前結(jié)束可能會發(fā)生一些問題。
首先抡医,因為它還強引用著 View,Activity 對象將被保留在內(nèi)存中早敬,直到線程任務(wù)終于完成忌傻。
這就是內(nèi)存泄漏(內(nèi)存泄漏指的是由于某些原因未能釋放已經(jīng)不再使用的內(nèi)存),而這可能導(dǎo)致 App 內(nèi)容不足搞监,最終導(dǎo)致崩潰水孩。
其次,任務(wù)完成之后更新這些 View 是浪費的琐驴,因為他們已經(jīng)不再可見俘种。
最后,你可能需要重復(fù)這個任務(wù)才能使得 VIew 更新绝淡。
你應(yīng)該讓線程工作正確響應(yīng) Activity 的生命周期宙刘,從而避免這些問題。
這時候你應(yīng)該使用 Loader牢酵。
Loader 是一種對于 Activity 生命周期的內(nèi)部明智的用法(這個翻譯的好差...)悬包,你可以確保每次工作都在正確的地方結(jié)束。
所以 Loader 可以有效的防止內(nèi)存泄漏馍乙,可以正確的更新視圖布近,沒有不必要的重復(fù)垫释。
讓我們來看看它如何工作,你可以在 Activity 中創(chuàng)建一個 LoaderManager 實例撑瞧,來替代 AsyncTask 或者其他線程上的任務(wù)棵譬。
將工作發(fā)送到 LoaderManager 并且它將確保當(dāng) Activity 配置改變時你的任務(wù)依然處理得當(dāng)。
LoaderManager 也會將任務(wù)結(jié)果緩存起來预伺,所以不必重復(fù)订咸。
現(xiàn)在如果一個帶有正在運行加載器的 Activity 正在被彈出棧,且不會再進(jìn)入任務(wù)棧中扭屁,那么這個正在運行的任務(wù)會發(fā)生什么呢算谈?
這種情況下 LoaderManager 會在你的代碼中進(jìn)行回調(diào),告訴你這個結(jié)果永遠(yuǎn)不會被使用料滥。
你可以使用這個回調(diào)終止這個任務(wù)然眼,清理和繼續(xù)其他任務(wù)進(jìn)而不在浪費任何資源。
值得注意的是葵腹, Loader 是針對 Activity 的高每,因此,它為你提供了一個堅實的框架践宴,用于將視圖與工作線程分開鲸匿,并最大限度的減少在 Activity 生命周期中的重復(fù)工作。
Loader 的缺點是要使用相當(dāng)多的額外代碼阻肩,從而將其正確的集成到你的 App 中带欢。
這就是本次視頻內(nèi)容,翻譯水平還有待提升(主要是翻譯成人話)烤惊,我會繼續(xù)努力的乔煞!