我的安卓应用有一个功能,用户可以通过抽屉菜单中的“同步”按钮同步保存在sqlite中的数据到服务器。点击同步按钮后,我会启动服务并将数据同步到服务器。
但现在我正在使用工作管理器来同步数据。我的问题是如何在按钮点击时立即启动工作管理器。
我正在创建一次性请求,有时它可以触发,但有时不能触发。
我的安卓应用有一个功能,用户可以通过抽屉菜单中的“同步”按钮同步保存在sqlite中的数据到服务器。点击同步按钮后,我会启动服务并将数据同步到服务器。
但现在我正在使用工作管理器来同步数据。我的问题是如何在按钮点击时立即启动工作管理器。
我正在创建一次性请求,有时它可以触发,但有时不能触发。
WorkManager 2.7.0 提出了加速工作的概念。加速工作可以立即启动,并在几分钟内完成。详细信息请参见文档。
OneTimeWorkRequestBuilder<T>().apply {
setInputData(inputData)
setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()
这里和这里是关于“高级”WorkManager指南/中介帖子的内容,其中涵盖了这方面的知识。
2020年7月,谷歌Android开发人员关系的Ben Weiss说道
我们建议你使用WorkManager来执行长时间运行的即时任务。/ 只需通过使用
setForeground
/setForegroundAsync
将其设置为前台服务即可。
调用setForegroundAsync的操作必须在ListenableWorker返回ListenableWorker.Result之前完成。 在底层,WorkManager代表您管理和运行一个前台服务来执行此WorkRequest,并显示在ForegroundInfo中提供的通知。这指定了WorkRequest是长时间运行或者非常重要的。在这种情况下,WorkManager向操作系统提供一个信号,以便在执行此工作时尽可能保持进程处于活动状态。
更新:
正确的方法是将逻辑与工作器分离,根据需要从工作器或UI中调用它。正如Nurseyit所指出的那样,WM不适用于即时任务。此外,还有android.arch.work:work-runtime-ktx
中的RxWorker
请参阅文档可以轻松包装Rx网络请求或Facade。
这可以用作快速修复或编码实验: 您可以通过按钮取消已排队的Work,并在下一行重新排队。工作管理器将尝试尽快启动这个新的工作者。当按钮被按下时,应用程序处于前台,因此工作很可能立即运行。这种方式也不会通过提取任务逻辑到单独的类来混淆Worker,检查Worker任务实例是否正在运行,取消,等待即时任务等。
文档中提到,WorkManager 仅适用于可延迟任务。因此我们不能期望它立即执行。在某些情况下,它可能会立即运行,但不能保证始终如此。您应该使用协程或执行器。
以下是答案: