O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Como encadear trabalhos

Introdução

A biblioteca WorkManager permite que você crie e coloque na fila uma rede de trabalho que especifica várias tarefas dependentes e define a ordem em que elas serão executadas. Isso é particularmente útil quando você precisa executar várias tarefas em uma ordem específica.

Para criar uma cadeia de trabalho, você pode usar WorkManager.beginWith(OneTimeWorkRequest) ou WorkManager.beginWith(List<OneTimeWorkRequest>), que retornam uma instância de WorkContinuation.

Um WorkContinuation pode ser usado para adicionar OneTimeWorkRequest dependentes usando WorkContinuation.then(OneTimeWorkRequest) ou WorkContinuation.then(List<OneTimeWorkRequest>).

Toda invocação de WorkContinuation.then(...) retorna uma novainstância de WorkContinuation. Se você adicionar um List de OneTimeWorkRequests, essas solicitações poderão ser executadas em paralelo.

Por fim, use o método WorkContinuation.enqueue() para enfileirar() sua cadeia de WorkContinuation.

Vejamos um exemplo em que um app executa filtros de imagem em três imagens diferentes (possivelmente em paralelo), depois compacta essas imagens e faz upload delas.

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();

    

Fusões de entrada

Ao usar redes de OneTimeWorkRequests, a saída dos OneTimeWorkRequests pais é passada como entradas para os filhos. Portanto, no exemplo acima, as saídas de filter1, filter2 e filter3 seriam passadas como entradas para a solicitação compress.

Para gerenciar entradas de vários OneTimeWorkRequests pais, o WorkManager usa InputMergers.

Há dois tipos diferentes de InputMerger fornecidos pelo WorkManager:

  • OverwritingInputMerger tenta adicionar todas as chaves de todas as entradas à saída. Em caso de conflitos, ela substitui todas as chaves definidas anteriormente.

  • ArrayCreatingInputMerger tenta mesclar as entradas, criando matrizes quando necessário.

Para o exemplo acima, como queremos preservar as saídas de todos os filtros de imagem, é necessário usar um 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();

    

Status de rede e trabalho

Há alguns pontos a serem considerados ao criar cadeias de OneTimeWorkRequests.

  • Os OneTimeWorkRequests dependentes são desbloqueados (transição para ENQUEUED), quando todos os OneTimeWorkRequests pais são bem-sucedidos (ou seja, retornam um Result.success()).

  • Quando qualquer OneTimeWorkRequest pai falha (retorna um Result.failure()), todos os OneTimeWorkRequests dependentes também são marcados como FAILED.

  • Quando qualquer OneTimeWorkRequest pai é cancelado, todos os OneTimeWorkRequests dependentes também são marcados como CANCELLED.

Para ver mais informações, consulte Como cancelar e interromper trabalho.