web-dev-qa-db-ja.com

WorkManagerを使用した定期的な毎日の作業要求

Android Jetpackから新しいWorkManagerを適切に使用して、1日1回の定期的な作業をスケジュールし、毎日何らかのアクションを実行する必要がありますか?

アイデアは、WorkManagerを使用して特定のタグを持つ作業が既に存在するかどうかを確認し、それ以外の場合は新しい定期的な作業を開始することでした。

私は次のアプローチを使用してそれをやろうとしました:

_public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}
_

ただし、valuedoWork()メソッド内にブレークポイントを配置し(したがって、確実に進行中です)、別のスレッドから作業ステータスをチェックしても、Workerは常にnullです。 。

9
Gaket

enqueueUniquePeriodicWorkメソッドを使用できるようになりました。 WorkManagerの1.0.0-alpha03リリースで追加されました。

11
Greg Dan

あなたが探している enqueueUniquePeriodicWork

このメソッドを使用すると、一意の名前が付けられたエンキューPeriodicWorkRequest を使用できます。特定の名前のPeriodicWorkRequestを一度に1つだけアクティブにできます。たとえば、1つの同期操作のみをアクティブにしたい場合があります。保留中のものがあれば、それを実行させるか、新しい作業に置き換えるかを選択できます。

サンプルコード

public static final String TAG_MY_WORK = "mywork";

public static void scheduleWork(String tag) {
    PeriodicWorkRequest.Builder photoCheckBuilder =
            new PeriodicWorkRequest.Builder(WorkManagerService.class, 1, TimeUnit.DAYS);
    PeriodicWorkRequest request = photoCheckBuilder.build();
    WorkManager.getInstance().enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , request);
}

2つのタイプの ExistingPeriodicWorkPolicy を取得します

キープ

同じ一意の名前を持つ保留中の作業が存在する場合は、何もしません。

交換

同じ一意の名前を持つ保留中の作業が存在する場合は、キャンセルして削除します。

3
Khemraj

最終的に、問題はLiveDataの使用方法にあると理解しました。オブザーバーがいないため、内部に値はありません。

PeriodicWorkのみを使用する場合の問題は、実行したい作業の一意性が保証されないことです。言い換えると、必要な回数を超えて同時に発動するアクティブな作品を多数持つことができます。

1
Gaket