如何立即运行WorkManager

13

我的安卓应用有一个功能,用户可以通过抽屉菜单中的“同步”按钮同步保存在sqlite中的数据到服务器。点击同步按钮后,我会启动服务并将数据同步到服务器。

但现在我正在使用工作管理器来同步数据。我的问题是如何在按钮点击时立即启动工作管理器。

我正在创建一次性请求,有时它可以触发,但有时不能触发。


你可以使用后台服务来替代Workmanager。 - Harish Jose
@HarishJose 我不能使用服务,因为我需要每20分钟运行同步进程(即使应用程序在后台)。如果我使用服务,那么我必须将其设置为前台服务以适应更新的Android版本(API 26或更高版本)。 - sanjay
是的,你说得对。那么为什么不试试使用Workmanager来完成任务呢?时间可以设置得非常短(比如从现在开始几秒钟后执行)。 - Harish Jose
1
@HarishJose 我们无法将 Workmanager 设置为少于 15 分钟运行。 - sanjay
4个回答

9

WorkManager 2.7.0 提出了加速工作的概念。加速工作可以立即启动,并在几分钟内完成。详细信息请参见文档

OneTimeWorkRequestBuilder<T>().apply {
    setInputData(inputData) 
 setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()

3

这里这里是关于“高级”WorkManager指南/中介帖子的内容,其中涵盖了这方面的知识。

2020年7月,谷歌Android开发人员关系的Ben Weiss说道

我们建议你使用WorkManager来执行长时间运行的即时任务。/ 只需通过使用setForeground/ setForegroundAsync将其设置为前台服务即可。

这指定了WorkRequest是长时间运行或者非常重要的。在这种情况下,WorkManager向操作系统提供一个信号,以便在执行此工作时尽可能保持进程处于活动状态。

文档

调用setForegroundAsync的操作必须在ListenableWorker返回ListenableWorker.Result之前完成。 在底层,WorkManager代表您管理和运行一个前台服务来执行此WorkRequest,并显示在ForegroundInfo中提供的通知。

1

更新: 正确的方法是将逻辑与工作器分离,根据需要从工作器或UI中调用它。正如Nurseyit所指出的那样,WM不适用于即时任务。此外,还有android.arch.work:work-runtime-ktx中的RxWorker请参阅文档可以轻松包装Rx网络请求或Facade。

这可以用作快速修复或编码实验: 您可以通过按钮取消已排队的Work,并在下一行重新排队。工作管理器将尝试尽快启动这个新的工作者。当按钮被按下时,应用程序处于前台,因此工作很可能立即运行。这种方式也不会通过提取任务逻辑到单独的类来混淆Worker,检查Worker任务实例是否正在运行,取消,等待即时任务等。


1

如果您需要每20分钟或在固定时间点进行处理,请尝试使用闹钟管理器。 - Nurseyit Tursunkulov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接