web-dev-qa-db-ja.com

WorkManagerを使用したPeriodicWorkRequest

WorkManagerがGoogle I/Oに新しく導入されたので、workmanagerを使用して定期的にタスクを実行しようとしています。

私がやっていることは、次のようにPeriodicWorkRequestを使用して作業をスケジュールすることです。

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest build = new PeriodicWorkRequest.Builder(SyncJobWorker.class, MY_SCHEDULE_TIME, TimeUnit.MILLISECONDS)
           .addTag(TAG)
           .setConstraints(constraints)
           .build();

WorkManager instance = WorkManager.getInstance();
if (instance != null) {
          instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);
}

私が抱えている問題は、PeriodicWorkRequestをリクエストしているときにもすぐに機能し始めることです。

  • PeriodicWorkRequestを使用している間、誰かがその即時の作業実行を停止する方法を知っていますか?
  • また、作業を再スケジュールする方法を知りたいですか? すでにスケジュールされた作業の時間を変更したい場合はどうしますか?

私は使用しています:implementation "Android.Arch.work:work-runtime:1.0.0-alpha04"

どんな助けでもありがたいです。

5

PeriodicWorkRequest.Builder でフレックス期間を使用すると、これを実現できます。たとえば、繰り返し間隔の最後(たとえば8時間)の15分以内にワーカーを実行する場合、コードは次のようになります。

val periodicRefreshRequest = PeriodicWorkRequest.Builder(
            RefreshWorker::class.Java, // Your worker class
            8, // repeating interval
            TimeUnit.HOURS,
            15, // flex interval - worker will run somewhen within this period of time, but at the end of repeating interval
            TimeUnit.MINUTES
    )

視覚的イラスト

6

コードは常に作業を再スケジュールするため、必要に応じて作業パラメーターを変更できます

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);

変更せずに同じパラメータを使用して(再起動後も)作業を続けたい場合は、次のコマンドを使用します。

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, build);

その場合、作業がまだ評価されていない場合にのみスケジュールされます。

作業タスクを停止するには、

// cancel the unique work
instance.cancelUniqueWork(TAG);
// clear all finished or cancelled tasks from the WorkManager 
instance.pruneWork();

ところで、同じタグをunigueの作業IDとタスクタグとして使用するのは良い方法ではないと思います。独自の作業が必要な場合-タスクタグはまったく必要ありません。タスクタグは、いくつかのタスクが必要な場合のためのものです

0
Alex