web-dev-qa-db-ja.com

WorkManagerbeginUniqueWorkが期待どおりに機能しない

現在、WorkManager1.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はまったく実行されていません。

逃したステップを教えてください。ありがとうございました。

6
Cheok Yan Cheng

beginUniqueWork()WorkContinuationオブジェクト を返します。実際にWorkManagerでキューに入れるには、そのenqueueWorkContinuationを呼び出す必要があります。

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

@ianhanniballakeからの回答はもちろん役に立ち、正しいですが、(急速に進化するAPIでは) new enqueueUniqueWork() method があることを指摘したいと思いました。 OPが使用できるようになったと思います。

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