Android WorkManager 周期性工作请求不唯一。

3

对于OneTimeWorkRequest,我们可以使用WorkContinuation来确保如果作业已经被安排,我们可以选择保留或替换它。 但是对于PeriodicWorkRequest,没有这样的选项,因此每次创建主活动时都会创建一个新的作业,过一段时间后就会出现此异常。

java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs

所以我正在尝试以下方法创建“唯一周期性工作”

public void schedule(){
    Constraints constraints = new Constraints.Builder().setRequiresBatteryNotLow(true).build();
    OneTimeWorkRequest zombieSpawnWorker = new OneTimeWorkRequest.Builder(ZombieSpawnWorker
            .class).setInitialDelay(15, TimeUnit.MINUTES).setConstraints(constraints).addTag(ZombieSpawnWorker.TAG).build();
    this.setUuid(zombieSpawnWorker.getId());
    WorkManager.getInstance().beginUniqueWork(TAG,
                    ExistingWorkPolicy.KEEP,
                    OneTimeWorkRequest.from(ZombieSpawnWorker.class));
}

然后在工作结束时再次调用此方法。

public WorkerResult doWork() {
    try {
        //work to be done
    } catch (Exception e) {
        Log.e(TAG,e.getLocalizedMessage());
        return WorkerResult.FAILURE;
    }
    schedule();
    return WorkerResult.SUCCESS;
}
2个回答

5

另一个解决方法是在PeriodicWorkRequestBuilder中添加一个标签REQUEST_TAG,然后在将周期性请求加入队列之前调用WorkManager.getInstance().cancelAllWorkByTag(REQUEST_TAG)取消所有带有此标签的工作。


1
您看到的IllegalStateException是我们在alpha01中修复的错误。使用alpha02库,您将不会看到该问题。有关更多信息,请查看发布说明here

谢谢。我们已经更新到alpha02并再次观察。我想问一下,对于一次性的工作,执行结束后,我们是否需要显式取消标记以避免这种问题? - Cheok Yan Cheng
另外,我们正在使用WorkManager执行闹钟提醒调度。由于限制“应用程序可能不会安排超过100个不同的作业”,这是否意味着WorkManager不适合安排超过100个提醒? - Cheok Yan Cheng
@CheokYanCheng,你有没有找到超过100个作业异常的解决方案? - Sujeet Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接