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根本没有运行。

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

4

2 回答 2

24

beginUniqueWork()返回一个WorkContinuation对象。您需要调用enqueueWorkContinuation以将其与 WorkManager 实际排入队列:

workManager.beginUniqueWork(
    SyncWorker.TAG,
    ExistingWorkPolicy.REPLACE,
    oneTimeWorkRequest
).enqueue();
于 2018-06-02T14:53:15.347 回答
12

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

workManager.enqueueUniqueWork(
    SyncWorker.TAG,
    ExistingWorkPolicy.REPLACE,
    oneTimeWorkRequest
);
于 2018-12-17T08:34:46.827 回答