欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

工作状态和观察工作

工作状态

在工作的整个生命周期内,它会经历多个不同的 State在本文后面的部分中,我们会探讨如何观察这些变化。不过,您首先应对逐一了解各个状态:

  • 如果有尚未完成的前提性工作,工作处于 BLOCKED State
  • 如果工作能够在满足 Constraints 和时机条件后立即运行,将被视为处于 ENQUEUED
  • 当工作器在活跃执行时,其处于 RUNNING State
  • 返回 Result.success() 的工作器会被视为 SUCCEEDED。这是一种终止 State;只有 OneTimeWorkRequest 可以进入这种 State
  • 相反,返回 Result.failure() 的工作器会被视为 FAILED。这也是一种终止 State;只有 OneTimeWorkRequest 可以进入这种 State。所有依赖工作也会被标记为 FAILED,并且不会运行。
  • 当您明确取消尚未终止的 WorkRequest 时,它会进入 CANCELLED State。所有依赖工作也会被标记为 CANCELLED,并且不会运行。

观察您的工作

将工作加入队列后,您可以通过 WorkManager 检查其状态。相关信息在 WorkInfo 对象中提供,包括工作的 id、标签、当前 State 和任何输出数据。

您通过以下三种方式之一来获取 WorkInfo

利用每个方法的 LiveData 变量,您可以通过注册监听器来观察 WorkInfo 的变化。例如,如果您想要在某项工作成功完成后向用户显示消息,您可以进行如下设置:

Kotlin

    WorkManager.getInstance(myContext).getWorkInfoByIdLiveData(uploadWorkRequest.id)
            .observe(lifecycleOwner, Observer { workInfo ->
                if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
                    displayMessage("Work finished!")
                }
            })
    

Java

    WorkManager.getInstance(myContext).getWorkInfoByIdLiveData(uploadWorkRequest.getId())
            .observe(lifecycleOwner, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                  if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
                      displayMessage("Work finished!")
                  }
                }
            });