既にプロダクトで動いている WorkManager を停止させたいとき。
単純にWorkerを発火させるところをコメントアウトすれば解決! にはなりません![]()
この場合、新規ユーザーは問題ありませんが、既存ユーザーの場合が問題です。
既存ユーザーの場合、既に Worker の Request が登録されていると、 Worker は動いてしまうので停止処理を入れてあげる 必要があります。
Worker に登録されている かつ 登録されている Work のステータスがキューにあるか実行中の場合にその Work を停止させる処理の例です。
final ListenableFuture<List<WorkInfo>> listenableFuture = WorkManager.getInstance(context).getWorkInfosForUniqueWork(MyWorker.UNIQUE_WORK_NAME);
try {
final List<WorkInfo> workList = list.get();
if (workList != null && workList.get(0) != null) {
final WorkInfo.State status = workList.get(0).getState();
if (status == WorkInfo.State.ENQUEUED || status == WorkInfo.State.RUNNING) {
WorkManager.getInstance(context).cancelUniqueWork(MyWorker.UNIQUE_WORK_NAME);
}
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
上記のコードの流れは以下の通りです。
- getWorkInfosForUniqueWorkでWorkerのnameを指定して、ListenableFuture>型のlistenableFutureを取得
- list.get()でWorkInfoのリスト、workListを取得
- このworkListがnullでなければ、それはつまりMyWorkerのWorkが現在存在していることを意味する
- workList.get(0).getState()は先頭のWorkのステータス、statusを取得
statusが ENQUEUED または RUNNING の場合は、cancelUniqueWorkメソッドでそのWorkをキャンセルする