Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

Cómo encadenar trabajos

Introducción

WorkManager te permite crear y poner en cola una cadena de trabajo que especifica varias tareas dependientes. Además, define el orden en el que deberían ejecutarse. Esta función resulta particularmente útil cuando necesitas ejecutar varias tareas en un orden específico.

Para crear una cadena de trabajo, puedes usar WorkManager.beginWith(OneTimeWorkRequest) o WorkManager.beginWith(List<OneTimeWorkRequest>), que mostrarán una instancia de WorkContinuation.

Puedes usar una WorkContinuation para agregar OneTimeWorkRequest dependientes mediante WorkContinuation.then(OneTimeWorkRequest) o WorkContinuation.then(List<OneTimeWorkRequest>).

Cada invocación de WorkContinuation.then(...) muestra una nueva instancia de WorkContinuation. Si agregas una List de OneTimeWorkRequest, estas solicitudes pueden ejecutarse en paralelo.

Por último, puedes usar el método WorkContinuation.enqueue() para poner en cola tu cadena de WorkContinuation.

Echemos un vistazo a un ejemplo en el que una aplicación ejecuta filtros en 3 imágenes (potencialmente en paralelo) y, luego, las comprime y las sube.

Kotlin

    WorkManager.getInstance(myContext)
        // Candidates to run in parallel
        .beginWith(listOf(filter1, filter2, filter3))
        // Dependent work (only runs after all previous work in chain)
        .then(compress)
        .then(upload)
        // Don't forget to enqueue()
        .enqueue()

    

Java

    WorkManager.getInstance(myContext)
        // Candidates to run in parallel
        .beginWith(Arrays.asList(filter1, filter2, filter3))
        // Dependent work (only runs after all previous work in chain)
        .then(compress)
        .then(upload)
        // Don't forget to enqueue()
        .enqueue();

    

Combinadores de entradas

Cuando se usan cadenas de OneTimeWorkRequest, las salidas de las OneTimeWorkRequest superiores se pasan como entradas a las secundarias. En el ejemplo anterior, las salidas de filter1, filter2 y filter3 se pasarán como entradas a la solicitud de compress.

Para administrar las entradas de varias OneTimeWorkRequest superiores, WorkManager usa InputMerger.

WorkManager proporciona dos tipos diferentes de InputMerger:

  • OverwritingInputMerger intenta agregar todas las claves de todas las entradas en el resultado. En caso de conflictos, reemplaza las claves definidas anteriormente.

  • ArrayCreatingInputMerger intenta combinar las entradas y crea arreglos cada vez que sea necesario.

En el ejemplo anterior, dado que deseamos preservar los resultados de todos los filtros de imágenes, deberíamos usar un ArrayCreatingInputMerger.

Kotlin

    val compress: OneTimeWorkRequest = OneTimeWorkRequestBuilder<CompressWorker>()
        .setInputMerger(ArrayCreatingInputMerger::class)
        .setConstraints(constraints)
        .build()

    

Java

    OneTimeWorkRequest compress =
        new OneTimeWorkRequest.Builder(CompressWorker.class)
            .setInputMerger(ArrayCreatingInputMerger.class)
            .setConstraints(constraints)
            .build();

    

Estados de trabajo y encadenado

Debes tener en cuenta lo siguiente cuando creas cadenas de OneTimeWorkRequest:

  • Las OneTimeWorkRequest dependientes solo están desbloqueadas (transición a ENQUEUED), cuando todas sus OneTimeWorkRequest superiores se ejecutaron correctamente (es decir, mostraron Result.success()).

  • Cuando una OneTimeWorkRequest superior falla (muestra Result.failure()), todas las OneTimeWorkRequest dependientes también se marcan como FAILED.

  • Cuando se cancela una OneTimeWorkRequest superior, todas las OneTimeWorkRequest dependientes también se marcan como CANCELLED.

Para obtener más información, consulta Cómo cancelar y detener el trabajo.