【问题标题】:How to automatically cancel periodic work (Workmanager)?如何自动取消定期工作(Workmanager)?
【发布时间】:2020-04-02 01:58:39
【问题描述】:

我需要在满足条件时取消/删除我的工作。我读过有一个方法 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()
    }
}

编辑: 我的错,我忘了说这是一部独特的周期性作品。

【问题讨论】:

    标签: android kotlin android-workmanager


    【解决方案1】:

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

    【讨论】:

    • 但它仍将被排队。它将运行,除了返回失败之外什么都不做。
    • 所以基本上这意味着不断观察所有工人并删除失败的工人......我考虑了一下。但是,如果我只是取消本身的工人呢?这是一个不好的做法吗?因为我刚刚测试过,它工作得很好。检查更新的问题...
    • @NickWilde .. 问题是您需要取消工作人员并在doWork() 内提出,我的意思是在执行您的工作期间,因此您需要观察您的工作直到满足该条件;这就是我取消它的原因;
    • @NickWilde 可能有更好的解决方案,但我没有测试它,您可以拥有一个由您的活动实现的侦听器,它启动周期性工作,并以某种方式将该侦听器的实例传递给您的 Worker,并在您需要取消工作时触发其回调,然后在活动的回调中使用 WorkManager.getInstance(MainActivity.this).cancelWorkById(workRequest.getId());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2015-02-05
    相关资源
    最近更新 更多