Estados y observación de los trabajos

Estados del trabajo

A medida que transcurre el ciclo de vida de tu trabajo, este pasa por varios State (estados). Más adelante en este documento, se detalla cómo observar los cambios. Pero primero, debes conocerlos:

  • El trabajo se encuentra en el estado BLOCKED State si tiene trabajo de requisito previo que todavía no finalizó.
  • El trabajo apto para ejecutarse en cuanto se cumplan sus Constraints y tiempos se considera en estado ENQUEUED.
  • Cuando un trabajador se ejecuta activamente, se encuentra en estado RUNNING State.
  • Un trabajador que mostró Result.success() es considerado SUCCEEDED. Este es un State terminal; solo los OneTimeWorkRequest pueden ingresar en este State.
  • En cambio, un trabajador que mostró Result.failure() se considera FAILED. Este también es un State terminal; solo los OneTimeWorkRequest pueden ingresar en este State. Todo el trabajo dependiente también se marcará como FAILED y no se ejecutará.
  • Cuando cancelas explícitamente una WorkRequest que todavía no finalizó, esta ingresa en CANCELLED State. Todo el trabajo dependiente también se marcará como CANCELLED y no se ejecutará.

Cómo observar tu trabajo

Después de colocar tu trabajo en cola, WorkManager te permite comprobar su estado. Esta información está disponible en un objeto WorkInfo, que incluye el id del trabajo, sus etiquetas, su State actual y los datos de salida.

Existen tres formas de obtener WorkInfo:

Las variantes de LiveData de cada uno de los métodos te permiten observar los cambios en WorkInfo al registrar al objeto de escucha. Por ejemplo, si quieres mostrar un mensaje al usuario cuando el trabajo finaliza correctamente, puedes configurarlo de la siguiente manera:

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!")
                  }
                }
            });