作業チェーンの作成

概要

WorkManager を使用すると、複数の依存タスクを指定し、その実行順序を定義する作業チェーンを作成してキューに登録することができます。これは、複数のタスクを特定の順序で実行する必要がある場合に特に便利です。

作業チェーンを作成するには、WorkContinuation のインスタンスを返す WorkManager.beginWith(OneTimeWorkRequest) または WorkManager.beginWith(List<OneTimeWorkRequest>) を使用します。

さらに、WorkContinuation を使用し、WorkContinuation.then(OneTimeWorkRequest) または WorkContinuation.then(List<OneTimeWorkRequest>) を呼び出して、依存する OneTimeWorkRequest を追加できます。

WorkContinuation.then(...) は、呼び出すたびに WorkContinuation の新しいインスタンスを返します。OneTimeWorkRequestList を追加すると、場合によってはこれらのリクエストを同時に実行できます。

最後に、WorkContinuation.enqueue() メソッドを使用すると、WorkContinuation のチェーンをキューに登録できます。

ここで、アプリで 3 つの画像に対して画像フィルタを実行し(同時に実行される可能性があります)、それらの画像をまとめて圧縮してアップロードする例を見てみましょう。

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

    

入力マージツール

OneTimeWorkRequest のチェーンを使用する場合、親の OneTimeWorkRequest の出力が子への入力として渡されます。上の例では、filter1filter2filter3 の出力が compress リクエストへの入力として渡されています。

WorkManager では、親の複数の OneTimeWorkRequest からの入力を管理するために InputMerger を使用します。

WorkManager が提供する InputMerger には次の 2 種類があります。

  • OverwritingInputMerger: すべての入力のすべてのキーを出力に追加しようとします。競合が発生すると、以前に設定したキーを上書きします。

  • ArrayCreatingInputMerger: 入力をマージして、必要に応じて配列を作成しようとします。

上の例では、すべての画像フィルタからの出力を保持する場合、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();

    

チェーンの作成と作業のステータス

OneTimeWorkRequest のチェーンを作成する際に留意すべき点を以下に示します。

  • 親の OneTimeWorkRequest がすべて成功した場合(Result.success() が返された場合)、依存する OneTimeWorkRequest のみがブロック解除されます(ENQUEUED に遷移)。

  • 親の OneTimeWorkRequest が失敗した場合(Result.failure() が返された場合)、依存するすべての OneTimeWorkRequestFAILED としてマークされます。

  • 親の OneTimeWorkRequest がキャンセルされた場合、依存するすべての OneTimeWorkRequestCANCELLED としてマークされます。

詳しくは、作業のキャンセルと中止をご覧ください。