6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

작업 체이닝

소개

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

    

자바

    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의 출력이 하위 요소에 입력으로 전달됩니다. 따라서 위 예에서 filter1, filter2, filter3의 출력이 compress 요청에 입력으로 전달됩니다.

여러 상위 OneTimeWorkRequest의 입력을 관리하기 위해 WorkManager는 InputMerger를 사용합니다.

다음은 WorkManager에서 제공하는 서로 다른 두 가지 InputMerger 유형입니다.

  • OverwritingInputMerger는 모든 입력의 키를 출력에 모두 추가하려고 시도합니다. 충돌이 발생하면 이전에 설정한 키를 덮어씁니다.

  • ArrayCreatingInputMerger는 필요한 경우 배열을 만들며 입력을 병합하려고 시도합니다.

위 예에서는 모든 이미지 필터의 출력을 유지하려고 하기 때문에 ArrayCreatingInputMerger를 사용해야 합니다.

Kotlin

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

    

자바

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

    

체이닝 및 작업 상태

OneTimeWorkRequest 체인을 만들 때 명심해야 할 것이 몇 가지 있습니다.

  • 종속 OneTimeWorkRequest는 모든 상위 OneTimeWorkRequest가 성공적(즉, Result.success()를 반환함)일 때만 차단 해제(ENQUEUED로 전환)됩니다.

  • 상위 OneTimeWorkRequest가 실패(즉, Result.failure() 반환함)되면 모든 종속 OneTimeWorkRequestFAILED로 표시됩니다.

  • 상위 OneTimeWorkRequest가 취소되면 모든 종속 OneTimeWorkRequestCANCELLED로 표시됩니다.

자세한 내용은 작업 취소 및 중지를 참조하세요.