Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WorkManager-如何按顺序执行作业_Android_Android Workmanager - Fatal编程技术网

Android WorkManager-如何按顺序执行作业

Android WorkManager-如何按顺序执行作业,android,android-workmanager,Android,Android Workmanager,我有一个服务正在侦听传入的FCM通知。收到此类通知后,我会使用WorkManager运行作业 当同时收到多个通知时,如何确保一次只执行一个作业?作业应按顺序执行。在这种情况下,我想发送短信,这些不能同时发送。(请注意,我在发送sms之前和之后都会在此作业中执行http请求等其他操作,这就是为什么我决定为其创建作业,而不是直接从服务发送sms。) 我已经检查了WorkManager文档中的高级部分;它提到了链式序列,但是这些序列必须明确地相互链接(从/then/then/…。您需要将作业创建为具有

我有一个服务正在侦听传入的FCM通知。收到此类通知后,我会使用WorkManager运行作业

当同时收到多个通知时,如何确保一次只执行一个作业?作业应按顺序执行。在这种情况下,我想发送短信,这些不能同时发送。(请注意,我在发送sms之前和之后都会在此作业中执行http请求等其他操作,这就是为什么我决定为其创建作业,而不是直接从服务发送sms。)


我已经检查了WorkManager文档中的高级部分;它提到了链式序列,但是这些序列必须明确地相互链接(从/then/then/…。

您需要将作业创建为具有相同组名的OneTimeWorkRequest,并使用APPEND将其作为唯一的工作排队。 这将使所有作业附加到同一个链并按顺序执行

请注意,您应该始终返回Result.SUCCESS或Result.RETRY,最多返回一次。返回Result.FAILURE将取消所有排队作业。 如果需要知道作业是否失败,则可以在worker setOutputData中设置自定义标志,以根据需要处理此类场景

final String JOB_GROUP_NAME = "your_jobs_group_name";

......

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YOUR_WORK.class)
    .setInputData(YOUR_WORK_DATA_BUILDER.build())
    .build();

final WorkManager workManager = WorkManager.getInstance();
WorkContinuation work = workManager.beginUniqueWork(JOB_GROUP_NAME, ExistingWorkPolicy.APPEND, request);
work.enqueue();

注意:在这种情况下,您将无法停止组中的一个作业。除非您将该特定工作的UUID存储在某个位置。我尝试使用ExistingWorkPolicy.APPEND,但直到某一点,它才起作用。如果您必须让27名工作人员排队,那么在某个时刻,他们将保持运行状态,永远不会结束。我在问题跟踪器中打开了一个问题:使用始终返回
结果。成功
结果。重试
,如何在不取消整个链的情况下取消正在运行的作业?
final String JOB_GROUP_NAME = "your_jobs_group_name";

......

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YOUR_WORK.class)
    .setInputData(YOUR_WORK_DATA_BUILDER.build())
    .build();

final WorkManager workManager = WorkManager.getInstance();
WorkContinuation work = workManager.beginUniqueWork(JOB_GROUP_NAME, ExistingWorkPolicy.APPEND, request);
work.enqueue();