做者 / 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 库了。