在多進程應(yīng)用中使用 WorkManager
:memo: 最近發(fā)布的 WorkManager 2.5.0 更適用于在多進程環(huán)境中使用,并提供了多項穩(wěn)定性改進。
因此,如果您的某款應(yīng)用管理著多個進程,并需要一種穩(wěn)健的方式來管理后臺工作 (不再出現(xiàn)初始化錯誤 ⚠),那么此版本便是您的首選。
您需要對代碼進行幾處更改,請繼續(xù)閱讀以了解更多內(nèi)容。
在本文末尾,我還將列出此版本 WorkManager 庫中的一些其他行為變更和新增內(nèi)容。
隆重推出: work-multiprocess
這一全新的多進程工件通過將作業(yè)調(diào)度統(tǒng)一為單個進程,從而帶來性能的提升。要開始使用此工件,請將其添加到您的應(yīng)用。
- Implementation "androidx.work:work-multiprocess:2.5.0"
您現(xiàn)在可以 選擇 WorkManager 用于將 WorkRequest 加入隊列的指定進程,并運行其進程中調(diào)度程序。
-
選擇
hhttps://developer.android.google.cn/topic/libraries/architecture/workmanager/advanced/custom-configuration
使用 Configuration.Provider 的配置如下所示。
- class MyApplication() : Application(), Configuration.Provider { override fun getWorkManagerConfiguration() =
- Configuration.Builder()
- .setProcessName("com.example:remote")
- .build()
- }
注意: 您需要傳遞完全限定的進程名稱作為 setProcessName 的參數(shù),該名稱由您的應(yīng)用包名稱,后跟英文冒號和主機的進程名稱組成,例如 com.example:remote 。
使用 work-multiprocess 時,您需要使用 RemoteWorkManager (而非 WorkManager ) 來管理您的工作請求。 RemoteWorkManager 將始終使用指定的進程將您的工作加入隊列。這可確保您不會在調(diào)用進程中意外初始化新的 WorkManager。進程中調(diào)度程序也會在指定的同一進程中運行。
-
RemoteWorkManager
https://developer.android.google.cn/reference/androidx/work/multiprocess/RemoteWorkManager
優(yōu)勢
按照上述方法配置 WorkManager 并使用 RemoteWorkManager 調(diào)度作業(yè)時,您的工作會在多進程應(yīng)用中得到更快速、更可靠的管理。這是因為 SQLite 爭用 情況會大大減少 (因為我們不再依賴于以文件為基礎(chǔ)的鎖定),且不再需要跨進程的作業(yè)協(xié)調(diào),因為您的應(yīng)用僅會在您指定的進程中運行單個 WorkManager 實例。
-
爭用
https://en.wikipedia.org/wiki/Resource_contention
行為變更 :twisted_rightwards_arrows:
作業(yè)協(xié)調(diào)
之前,當 ActivityManager 無法實例化 JobService 以啟動作業(yè)時,該作業(yè)將因為平臺中的底層問題而被靜默刪除。WorkManager 現(xiàn)在可確保通過協(xié)調(diào) WorkRequest 對象與作業(yè)創(chuàng)建 "應(yīng)用" 實例時,每個 WorkRequest 都會有一個后備調(diào)度程序作業(yè)。
限制內(nèi)部數(shù)據(jù)庫增長
我們發(fā)現(xiàn)應(yīng)用崩潰的原因之一是設(shè)備存儲空間不足。這種情況主要發(fā)生在存儲空間本來就很少的設(shè)備上。但是,當應(yīng)用調(diào)度 大量 工作時,導(dǎo)致設(shè)備存儲空間不足的部分原因在于 WorkManager。
默認情況下,內(nèi)部的 WorkManager 數(shù)據(jù)庫會將已完成作業(yè)的記錄保留 7 天。而現(xiàn)在,這個期限已減少至 1 天,大大降低了數(shù)據(jù)庫的大小。
我們縮短了緩沖區(qū)持續(xù)時間,這樣您就能借助 keepResultsForAtLeast() API 控制作業(yè)應(yīng)被保留的時長。
全新測試 API :sparkles:
如果您將 ListenableFuture 和 WorkManager 配合使用,測試工作會變得更輕松 — TestListenableWorkerBuilder Kotlin 擴展程序現(xiàn)在可以接收任何類擴展 ListenableWorker ,從而在測試過程中為您提供更高的靈活性。
問題修復(fù) :bug:
除了新增的功能,此版本還包含多個錯誤修復(fù),以提高 WorkManager 的穩(wěn)定性、可靠性和性能。您可以在 版本說明 中查看所有更改以及修復(fù)的錯誤。
-
版本說明
https://developer.android.google.cn/jetpack/androidx/releases/work#2.5.0
如何改進 WorkManager
通過 GitHub 向 WorkManager 貢獻內(nèi)容 :woman::computer:
WorkManager 以及其他幾個 Jetpack 庫都接受通過 GitHub 貢獻的內(nèi)容。
Alan Viverette 撰寫了 一篇關(guān)于整個流程的 詳盡博文 。
-
Alan Viverette
https://medium.com/@alan.viverette
-
詳盡博文
https://medium.com/androiddevelopers/introducing-jetpack-on-github-c2c9f12e62a9
遇到問題時請告訴我們 :memo:
2.5.0 版本中修復(fù)的大部分錯誤都是通過 公開問題跟蹤器 報告的。
-
公開問題跟蹤器
https://issuetracker.google.com/issues?q=componentid:409906
創(chuàng)建可修復(fù)問題的最佳方式就是 創(chuàng)建一個我們可復(fù)現(xiàn)的問題 。為幫助我們再現(xiàn)問題,建議您使用該 WorkManager 示例 ,或通過問題描述提供您的示例代碼。
-
創(chuàng)建可復(fù)現(xiàn)的問題
https://issuetracker.google.com/issues/new?component=409906
-
WorkManager 示例
https://github.com/android/architecture-components-samples/tree/main/WorkManagerSample
是時候行動起來,并更新您應(yīng)用中使用的 WorkManager 庫了。