如何知道队列是否无法成功触发/执行工作程序?

时间:2018-11-14 20:49:12

标签: android android-workmanager

我将工人添加到队列中,如下所示。但是,有时不会触发工人。我怎么知道工人是否没有被处决,以便我可以重新入队?也许使用Operation返回的enqueue()实例?如何使用它?如果是这样,是否可以暗示未能触发工人的原因?

请注意,我不需要知道Worker是否失败(return Result.FAILURE)。我想讲的是甚至没有打电话给工人的情况,这种情况偶尔发生。

OneTimeWorkRequest sendMessageWorker = new OneTimeWorkRequest.Builder(SendMessageWorker.class)
        .setInputData(data)
        .setBackoffCriteria(BackoffPolicy.LINEAR, backOffDelayInMillis, TimeUnit.MILLISECONDS)
        .build();

Operation operation = WorkManager.getInstance()
        .beginUniqueWork(SendMessageWorker.class.getSimpleName(), ExistingWorkPolicy.APPEND, sendMessageWorker)
        .enqueue();

3 个答案:

答案 0 :(得分:0)

使用ExistingWorkPolicy.APPEND,您正在创建工作链。
如果您在工作线程中返回Result.FAILURE(如果发生错误),则所有工作链都将被取消。这也许就是为什么您有时看不到工人在跑的原因。

一种建议是向您的工作人员添加标签或ID,并使用Livedata和getStatusesByTagLivedata()getStatusesById()观察状态。

您可以看看涵盖了本示例和其他示例的Android开发者峰会上展示的this talk

答案 1 :(得分:0)

您可以观察工人,并通过使用方法getStatusByIdLiveData进行观察来获得工人的状态

mWorkManager.getStatusByIdLiveData(yourWorkRequest.id)
        .observe(lifeCycleOwner, Observer { workStatus ->
            //here you can get the status of work
        })

答案 2 :(得分:0)

可以观察到工作经理的操作状态。

OneTimeWorkRequest sendMessageWorker = new OneTimeWorkRequest.Builder(SendMessageWorker.class)
        .setInputData(data)
        .setBackoffCriteria(BackoffPolicy.LINEAR, backOffDelayInMillis, TimeUnit.MILLISECONDS)
        .build();

Operation operation = WorkManager.getInstance()
        .beginUniqueWork(SendMessageWorker.class.getSimpleName(), ExistingWorkPolicy.APPEND, sendMessageWorker)
        .enqueue();

operation.getState().observe(ProcessLifecycleOwner.get(), (state -> {
            if (state instanceof Operation.State.SUCCESS) {
                // Handle success
            } else if (state instanceof Operation.State.FAILURE) {
                // Handle failure
            }
        }));