android - 如何自动取消定期工作(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()
}
}
编辑: 我的错误,我忘了提到这是一个独特的周期性工作。
解决方案
您可以尝试通过返回来取消工作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());
}
}
});
推荐阅读
- csv - 未设置查询语言:如果使用 csv 数据适配器,为什么会出现此错误?
- azure - 部署 Azure 逻辑应用和服务总线模板
- android - 为什么我的选项卡和底部菜单在平板电脑上的尺寸很小?
- javascript - 有没有办法有条件地更改 package.json 中的主条目文件?
- javascript - 如何从 for...of 循环返回值?
- javascript - 如何为带有变量的按钮赋值?
- c# - 如何锁定自动对焦
- android - 有没有办法在被Android操作系统杀死后强制重新启动应用程序?
- redux - 如何在使用 NgRx 完成前一个事件后发出一个事件?
- cmake - 如何将 sysroot 从 Yocto 传递给 cmake