做者 / Android 開發者關係 Ben Weissandroid
📝 最近發佈的 WorkManager 2.5.0 更適用於在多進程環境中使用,並提供了多項穩定性改進。git
所以,若是您的某款應用管理着多個進程,並須要一種穩健的方式來管理後臺工做 (再也不出現初始化錯誤 ⚠),那麼此版本即是您的首選。github
您須要對代碼進行幾處更改,請繼續閱讀以瞭解更多內容。數據庫
在本文末尾,我還將列出此版本 WorkManager 庫中的一些其餘行爲變動和新增內容。
這一全新的多進程工件經過將做業調度統一爲單個進程,從而帶來性能的提高。要開始使用此工件,請將其添加到您的應用。ide
Implementation "androidx.work:work-multiprocess:2.5.0"
您如今能夠 選擇 WorkManager 用於將 WorkRequest 加入隊列的指定進程,並運行其進程中調度程序。性能
使用 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。進程中調度程序也會在指定的同一進程中運行。ui
優點google
按照上述方法配置 WorkManager 並使用 RemoteWorkManager 調度做業時,您的工做會在多進程應用中獲得更快速、更可靠的管理。這是由於 SQLite 爭用 狀況會大大減小 (由於咱們再也不依賴於以文件爲基礎的鎖定),且再也不須要跨進程的做業協調,由於您的應用僅會在您指定的進程中運行單個 WorkManager 實例。spa
做業協調
以前,當 ActivityManager
沒法實例化 JobService
以啓動做業時,該做業將由於平臺中的底層問題而被靜默刪除。WorkManager 如今可確保經過協調 WorkRequest
對象與做業建立 "應用" 實例時,每一個 WorkRequest
都會有一個後備調度程序做業。
限制內部數據庫增加
咱們發現應用崩潰的緣由之一是設備存儲空間不足。這種狀況主要發生在存儲空間原本就不多的設備上。可是,當應用調度大量工做時,致使設備存儲空間不足的部分緣由在於 WorkManager。
默認狀況下,內部的 WorkManager 數據庫會將已完成做業的記錄保留 7 天。而如今,這個期限已減小至 1 天,大大下降了數據庫的大小。
咱們縮短了緩衝區持續時間,這樣您就能借助 keepResultsForAtLeast() API 控制做業應被保留的時長。
若是您將 ListenableFuture 和 WorkManager 配合使用,測試工做會變得更輕鬆 — TestListenableWorkerBuilder Kotlin 擴展程序如今能夠接收任何類擴展 ListenableWorker,從而在測試過程當中爲您提供更高的靈活性。
除了新增的功能,此版本還包含多個錯誤修復,以提升 WorkManager 的穩定性、可靠性和性能。您能夠在 版本說明 中查看全部更改以及修復的錯誤。
經過 GitHub 向 WorkManager 貢獻內容 👩💻
WorkManager 以及其餘幾個 Jetpack 庫都接受經過 GitHub 貢獻的內容。
Alan Viverette 撰寫了一篇關於整個流程的 詳盡博文。
遇到問題時請告訴咱們 📝
2.5.0 版本中修復的大部分錯誤都是經過 公開問題跟蹤器 報告的。
建立可修復問題 的最佳方式就是建立一個咱們可復現的問題。爲幫助咱們再現問題,建議您使用該 WorkManager 示例,或經過問題描述提供您的示例代碼。
是時候行動起來,並更新您應用中使用的 WorkManager 庫了。