web-dev-qa-db-ja.com

WorkManagerからのPeriodicWorkRequestの重複の回避

アプリケーションの起動時に永久に機能するサービスを開始したいのですが、ユーザーがアプリを再度開くと重複します。

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
        PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);
6
Igor Kostenko

enqueueUniquePeriodicWorkの代わりにenqueueを使用できます。ドキュメントに基づく:

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

あなたはそれを次のように達成することができます:

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
 PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
 WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data",  ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);

注:

ExistingPeriodicWorkPolicy.REPLACEは、uniqueWorkNameでラベル付けされた保留中の作業がある場合、それがキャンセルされ、新しい作業が実行されることを保証します。 ExistingPeriodicWorkPolicy.KEEPは、uniqueWorkNameでラベル付けされた保留中の作業がない場合にのみ、新しいPeriodicWorkRequestを実行します。

19
Sagar