Как автоматически отменить периоды c работы (Workmanager)? - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно отменить / удалить свою работу, когда она соответствует условию. Я читал, что есть метод onStopped (), который можно переопределить, но он предназначен для простого : рабочий , а не для CoroutineWorker .

Мой работник:

class MyJob(appContext: Context, params: WorkerParameters) :
    CoroutineWorker(appContext, params) {
    override suspend fun doWork(): Result {

        val itemId = inputData.getLong("item_id",0)
        val itemDao = ItemDB.getInstance(applicationContext).itemDao()
        val itemRepository = ItemRepo(itemsDao)

        val item = itemRepository.getItemById(itemId)
        val newValue = item.a + item.b
        item.a = newValue
        itemRepository.updateItem(item)

        if(item.a == item.c){         
    WorkManager.getInstance(applicationContext).cancelUniqueWork("TEST_WORKER")
        }

        return Result.success()
    }
}

РЕДАКТИРОВАТЬ: Моя ошибка, я забыл упомянуть, что это уникальный период c работа.

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете попытаться отменить работу, вернув Result.failure(); так что вы можете добавить его в соответствии с вашими условиями

if(item.a == item.c){
    //Cancel work
    return Result.failure()
}

Теперь вам нужно прослушать результат работы в вашей деятельности / фрагмент; поскольку вы не предоставили эту часть кода, я сделаю некоторые предположения и послушаю результаты работы с моделью наблюдения жизненного цикла

// instantiate periodic work
final PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(...).build();

// schedule the work
WorkManager.getInstance(this).enqueue(workRequest);

// observe the work
WorkManager.getInstance(this).getWorkInfoByIdLiveData(workRequest.getId())
        .observe(this, new Observer<WorkInfo>() {
            @Override
            public void onChanged(WorkInfo workInfo) {
                if (workInfo.getState() == WorkInfo.State.FAILED) {
                    // cancelling work
                    WorkManager.getInstance(MainActivity.this).cancelWorkById(workRequest.getId());
                }
            }
        });
...