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