【问题标题】:WorkManager beginUniqueWork doesn't work as expectedWorkManager beginUniqueWork 无法按预期工作
【发布时间】:2018-06-02 13:42:10
【问题描述】:

目前,我正在使用 WorkManager 1.0.0-alpha02。

def work_version = "1.0.0-alpha02"
implementation "android.arch.work:work-runtime:$work_version" // use -ktx for Kotlin
// optional - Firebase JobDispatcher support
implementation "android.arch.work:work-firebase:$work_version"

当应用程序退出时,使用以下代码执行后台工作程序没有问题。

使用入队,按预期工作

OneTimeWorkRequest oneTimeWorkRequest =
        new OneTimeWorkRequest.Builder(SyncWorker.class)
                .addTag(SyncWorker.TAG)
                .build();

WorkManager workManager = WorkManager.getInstance();

workManager.enqueue(oneTimeWorkRequest);

因此,我想避免同时运行多个SyncWorker。我尝试使用

使用 beginUniqueWork,不起作用

OneTimeWorkRequest oneTimeWorkRequest =
        new OneTimeWorkRequest.Builder(SyncWorker.class)
                .addTag(SyncWorker.TAG)
                .build();

WorkManager workManager = WorkManager.getInstance();

workManager.beginUniqueWork(
        SyncWorker.TAG,
        ExistingWorkPolicy.REPLACE,
        oneTimeWorkRequest
);

SyncWorker 根本没有运行。

我可以知道我错过了哪一步吗?谢谢。

【问题讨论】:

    标签: android android-workmanager


    【解决方案1】:

    beginUniqueWork() 返回一个WorkContinuation object。您需要在该 WorkContinuation 上调用 enqueue 才能将其实际加入 WorkManager:

    workManager.beginUniqueWork(
        SyncWorker.TAG,
        ExistingWorkPolicy.REPLACE,
        oneTimeWorkRequest
    ).enqueue();
    

    【讨论】:

    • 谢谢。我现在设法让它运行。我使用ExistingWorkPolicy.KEEP 进行测试,并故意让工作人员在循环睡眠时进行无限循环。运行的工人不超过 1 人。但是,如果我在第二次入队之前明确执行 cancelAllWorkByTag(SyncWorker.TAG)cancelUniqueWork(SyncWorker.TAG),我注意到之前的工作人员不会被杀死。然而,第二个工人被允许运行。这使得 2 个工作人员同时运行。这是否意味着,如果我们使用 beginUniqueWork,我们不应该调用 cancelAllWorkByTagcancelUniqueWork
    • 根据the documentation 取消是最好的努力。这同样适用于所有类型的工作
    • 好的。谢谢。最初我认为如果取消操作不成功,beginUniqueWork 将不会启动另一个工人。看来我的假设是错误的。
    • 还有额外的cancelation related APIs 将添加到 alpha03 中。您的 Worker 仍需要检查是否取消,但如果取消则提前结束工作
    • 似乎合理
    【解决方案2】:

    @ianhanniballake 的回答当然有用且正确,但我想我会指出(使用快速发展的 API)有一个 new enqueueUniqueWork() method,所以我猜 OP 现在可以使用:

    workManager.enqueueUniqueWork(
        SyncWorker.TAG,
        ExistingWorkPolicy.REPLACE,
        oneTimeWorkRequest
    );
    

    【讨论】:

    • 我有类似的代码,但是我的 Worker 没有被调用,为什么会这样?
    猜你喜欢
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    • 2020-09-21
    • 2011-08-17
    • 2012-04-29
    • 2021-08-12
    • 2019-02-04
    • 2014-12-02
    相关资源
    最近更新 更多