WorkManager beginUniqueWork无法按预期工作

Che*_*eng 6 android android-workmanager

目前,我正在使用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"
Run Code Online (Sandbox Code Playgroud)

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

使用enqueue,按预期工作

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

WorkManager workManager = WorkManager.getInstance();

workManager.enqueue(oneTimeWorkRequest);
Run Code Online (Sandbox Code Playgroud)

因为,我想避免SyncWorker同时运行多个.我试着用

使用beginUniqueWork,不起作用

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

WorkManager workManager = WorkManager.getInstance();

workManager.beginUniqueWork(
        SyncWorker.TAG,
        ExistingWorkPolicy.REPLACE,
        oneTimeWorkRequest
);
Run Code Online (Sandbox Code Playgroud)

SyncWorker 根本没有运行.

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

ian*_*ake 18

beginUniqueWork()返回一个WorkContinuation对象.您需要调用enqueue它WorkContinuation来实际使用WorkManager 将其排队:

workManager.beginUniqueWork(
    SyncWorker.TAG,
    ExistingWorkPolicy.REPLACE,
    oneTimeWorkRequest
).enqueue();
Run Code Online (Sandbox Code Playgroud)


drm*_*wer 12

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

workManager.enqueueUniqueWork(
    SyncWorker.TAG,
    ExistingWorkPolicy.REPLACE,
    oneTimeWorkRequest
);
Run Code Online (Sandbox Code Playgroud)

  • 我有一个类似的代码,但是我的 Worker 没有被调用,为什么会这样? (3认同)