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