如何立即运行Workmanager

时间:2018-11-14 10:27:53

标签: android

在我的Android应用程序中,我具有一项功能,用户可以通过在抽屉菜单中的某些位置按“同步”按钮来同步数据(保存在sqlite中)。单击同步按钮后,我将启动服务,数据将同步到服务器。

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

我正在创建一次性请求。它有时会触发,但其他时候不会。

4 个答案:

答案 0 :(得分:0)

已更新: 正确的方法是将逻辑与工作程序分离,并根据需要从工作程序或UI调用逻辑。正如Nurseyit指出的,WM不适合立即执行任务。还有RxWorker see docsandroid.arch.work:work-runtime-ktx,可以轻松包装Rx网络请求或外观。

这可以用作快速修复或编码实验: 您可以取消排队的工作方式按钮,然后在下一行再次将其排队。工作管理员将尝试尽快启动此新工作程序。按下按钮时,应用程序处于前台状态,因此很有可能立即运行Work。通过提取任务逻辑以分离类,检查In-Worker实例是否未运行,取消,等待即时任务等,这种方式也不会使Worker混乱。

答案 1 :(得分:0)

文档说workManager仅用于可延期的任务。因此,我们不能等待它立即执行。在某些情况下,它可能会立即运行,但没有保证它会一直运行。您应该使用协程或执行程序。

这是答案:

can I always use WorkManager instead of coroutines?

https://www.youtube.com/watch?v=pe_yqM16hPQ

答案 2 :(得分:0)

我认为,在调用WorkManager时,我们需要设置工作策略。 OneTimeWorkRequest有4个解决方案政策选项(ExistingWorkPolicy):REPLACE,KEEP,APPEND,APPEND_OR_REPLACE。 PeriodicWorkRequest有2个选项(ExistingPeriodicWorkPolicy):保持,替换

保持-如果先前的工作人员存在,则您的新尝试将被忽略,否则您的新工作人员将被排队。

REPLACE-如果先前的工作人员存在,则将其取消,从而导致其状态为CANCELED。否则,您的新工作人员将入队。

APPEND-如果存在以前的工作程序,则将新工作程序添加到队列中,否则新工作程序将入队。

APPEND_OR_REPLACE-此类型与APPEND几乎相同。如果先前的工作程序存在并且失败,则新工作程序的APPEND解析也会失败。在APPEND_OR_DELETE中,如果现有工作程序失败,则将删除失败的工作程序,然后下一个工作程序启动。

在这种情况下,我仅使用除KEEP之外的任何解决方案策略(取决于情况)启动WorkManager。因为如果存在未完成的工作,KEEP不会启动您的工作人员。

注意:WorkManager通过其唯一名称确定工人。如果您启动相同的工作程序,请使用相同的唯一ID进行呼叫。

PeriodicWorkerRequest

WorkManager.getInstance(context)
        .enqueueUniquePeriodicWork("uniqueWorkerName",
            ExistingPeriodicWorkPolicy.REPLACE, periodicWorker)

OneTimeWorkerRequest

WorkManager.getInstance(context)
        .enqueueUniqueWork("uniqueWorkerName",
            ExistingWorkPolicy.APPEND_OR_REPLACE, oneTimeWorker)

对于我来说,我将所有内容保存在数据库中并每小时进行同步(原因是网络故障)。当用户更改配置时,我将启动PeriodicWorker(如果用户拥有良好的网络,则会按时同步所有内容)。与您的情况几乎相同。

答案 3 :(得分:0)

Herehere是“高级” WorkManager指南/中级文章,对此进行了讨论。

2020年7月,Ben Weiss(Google Android开发人员关系)said

我们建议,您使用WorkManager执行长期运行的即时任务。 / 只要确保使用 val user = FirebaseAuth.getInstance().currentUser if (user != null) { val intent = Intent(this, home::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) finish() } / setForeground使其成为前台服务即可。

这指定WorkRequest是长期运行的或其他重要的。在这种情况下,WorkManager会向OS发出信号,要求该进程在执行过程中尽可能保持活动状态。

docs

对setForegroundAsync 的调用必须在ListenableWorker之前完成 通过返回ListenableWorker.Result表示完成。

在后台,WorkManager在以下位置管理和运行前台服务: 您代表执行此WorkRequest,并显示通知 在ForegroundInfo中提供。