首页 > 解决方案 > 如何自动取消定期工作(Workmanager)?

问题描述

我需要在满足条件时取消/删除我的工作。我读过有一个方法 onStopped() 可以被覆盖,但它适用于简单的:Worker而不是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()
    }
}

编辑: 我的错误,我忘了提到这是一个独特的周期性工作。

标签: androidkotlinandroid-workmanager

解决方案


您可以尝试通过返回来取消工作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());
                }
            }
        });

推荐阅读