在多進程應用中使用 WorkManager

做者 / Android 開發者關係 Ben Weissandroid

📝 最近發佈的 WorkManager 2.5.0 更適用於在多進程環境中使用,並提供了多項穩定性改進。git

所以,若是您的某款應用管理着多個進程,並須要一種穩健的方式來管理後臺工做 (再也不出現初始化錯誤 ⚠),那麼此版本即是您的首選。github

您須要對代碼進行幾處更改,請繼續閱讀以瞭解更多內容。數據庫

在本文末尾,我還將列出此版本 WorkManager 庫中的一些其餘行爲變動和新增內容。

隆重推出: work-multiprocess

這一全新的多進程工件經過將做業調度統一爲單個進程,從而帶來性能的提高。要開始使用此工件,請將其添加到您的應用。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 控制做業應被保留的時長。

全新測試 API ✨

若是您將 ListenableFuture 和 WorkManager 配合使用,測試工做會變得更輕鬆 — TestListenableWorkerBuilder Kotlin 擴展程序如今能夠接收任何類擴展 ListenableWorker,從而在測試過程當中爲您提供更高的靈活性。

問題修復 🐛

除了新增的功能,此版本還包含多個錯誤修復,以提升 WorkManager 的穩定性、可靠性和性能。您能夠在 版本說明 中查看全部更改以及修復的錯誤。

如何改進 WorkManager

經過 GitHub 向 WorkManager 貢獻內容 👩‍💻

WorkManager 以及其餘幾個 Jetpack 庫都接受經過 GitHub 貢獻的內容。

Alan Viverette 撰寫了一篇關於整個流程的 詳盡博文

遇到問題時請告訴咱們 📝

2.5.0 版本中修復的大部分錯誤都是經過 公開問題跟蹤器 報告的。

建立可修復問題 的最佳方式就是建立一個咱們可復現的問題。爲幫助咱們再現問題,建議您使用該 WorkManager 示例,或經過問題描述提供您的示例代碼。

是時候行動起來,並更新您應用中使用的 WorkManager 庫了。

相關文章
相關標籤/搜索