【问题标题】:WorkManager - how to execute jobs sequentiallyWorkManager - 如何按顺序执行作业
【发布时间】:2018-10-15 00:29:02
【问题描述】:

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

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

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //...
        OneTimeWorkRequest sendSmsWorker = new OneTimeWorkRequest.Builder(SendSmsWorker.class).build();
        WorkManager.getInstance().enqueue(sendSmsWorker);
        //...
    }
}

我查看了 WorkManager 文档中的高级部分;它提到了链式序列,但是它们必须明确地相互链接(beginWith/then/then/...)。

【问题讨论】:

    标签: android android-workmanager


    【解决方案1】:

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

    请注意,您应该始终返回 Result.SUCCESS,或最多返回 Result.RETRY。返回 Result.FAILURE 将取消所有排队的作业。 如果您需要知道作业是否失败,那么您可以在工作人员 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 个工作人员入队,那么在某些时候他们将保持运行状态并且永远不会完成。我在问题跟踪器中打开了一个问题:issuetracker.google.com/issues/155370056
    • 使用总是返回Result.SUCCESSResult.RETRY 的解决方法,如何在不取消整个链的情况下取消正在运行的作业?
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2021-05-23
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多