我们可以使用 WorkManager 在其他 UniqueWork 的队列中添加另一个 UniqueWork

Her*_*rry 5 android android-workmanager

假设我已经使用WorkManager开始了这个 UniqueWork :-

var workContinuation: WorkContinuation = WorkManager.getInstance()
                .beginUniqueWork(AppConstants.FILE_CREATOR_TAG,
                        ExistingWorkPolicy.APPEND,
                        firstOneTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)

现在,我们的应用程序用户可能想要为其他任务启动另一个 UniqueWork 工作,但该任务应该添加到上述工作任务的队列中。

var workContinuation: WorkContinuation = WorkManager.getInstance()
                    .beginUniqueWork(AppConstants.FILE_DISTRIBUTE_TAG,
                            ExistingWorkPolicy.APPEND,
                            fileDistrubuteTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)

现在我如何告诉 WorkManager 这个 UniqueWork AppConstants.FILE_DISTRIBUTE_TAG 应该在此 AppConstants.FILE_CREATOR_TAG 的队列中。

我不想使用 Observable 解决方案,在其中我可以跟踪该AppConstants.FILE_CREATOR_TAG工作人员的完成和启动AppConstants.FILE_DISTRIBUTE_TAG

小智 3

您应该uniqueWorkName为两个工作人员指定相同的值。参考beginUniqueWork 文档

唯一uniqueWorkName标识了这组工作。

如果此方法确定应将新工作排队并运行,则先前工作的所有记录都uniqueWorkName将被删除。如果此方法确定不应运行新工作,则整个链将被视为无操作。

如果链中的任何工作失败或被取消,则其所有依赖工作都会继承该状态并且永远不会运行。APPEND如果您使用ExistingWorkPolicy ,一点尤其重要。

因此,你的代码应该这样写:

var workContinuation: WorkContinuation = WorkManager.getInstance()
                .beginUniqueWork(AppConstants.SOME_UNIQUE_NAME,
                        ExistingWorkPolicy.APPEND,
                        firstOneTimeWorkRequest)

// ...

var workContinuation: WorkContinuation = WorkManager.getInstance()
                .beginUniqueWork(AppConstants.SOME_UNIQUE_NAME,
                        ExistingWorkPolicy.APPEND,
                        fileDistrubuteTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)

  • 我无法使用 SOME_UNIQUE_NAME 工作我的两个继续工作,因为这样,如果我只想取消第一个唯一工作,那么它将取消这两个工作,因为它们分配有相同的 beginUniqueWork 名称。在我的要求中,我希望两者都有单独的 uniueWorkName,因为我还想检查当前正在运行哪个工作组。 (2认同)