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);
}
_
ただし、value
のdoWork()
メソッド内にブレークポイントを配置し(したがって、確実に進行中です)、別のスレッドから作業ステータスをチェックしても、Worker
は常にnullです。 。
enqueueUniquePeriodicWork
メソッドを使用できるようになりました。 WorkManagerの1.0.0-alpha03リリースで追加されました。
あなたが探している 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 を取得します
キープ
同じ一意の名前を持つ保留中の作業が存在する場合は、何もしません。
交換
同じ一意の名前を持つ保留中の作業が存在する場合は、キャンセルして削除します。
最終的に、問題はLiveData
の使用方法にあると理解しました。オブザーバーがいないため、内部に値はありません。
PeriodicWork
のみを使用する場合の問題は、実行したい作業の一意性が保証されないことです。言い換えると、必要な回数を超えて同時に発動するアクティブな作品を多数持つことができます。