Android

WorkManager (4) : 작업 체이닝

까망사과 2022. 12. 10. 22:00

작업 체이닝

WorkContinuation 객체를 사용하면 일련의 일회성 작업을 체이닝하여 예약할 수 있다.

 

WorkManager#beginWith(OneTimeWorkRequest)는 처음 실행하고자 하는 작업 정보를 포함하는 WorkContinuation 객체를 반환한다. 그 다음 WorkContinuation#then(OneTimeWorkRequest)를 사용하여 이어서 실행하고자 하는 작업을 체이닝하면 된다. 한 번에 여러 작업을 동시에 실행하려면 위의 각 메서드의 파라미터로 List<OneTimeWorkRequest>를 전달한다.

 

마지막으로 WorkContinuation#enqueue()로 작업 체인을 WorkManager에 예약하면 된다.

 

다음은 work1, work2, work3를 동시에 실행한 다음 cache, upload를 순서대로 실행하도록 작업 체인을 예약하는 예시다.

WorkManager.getInstance(context)
    .beginWith(listOf(work1, work2, work3))
    .then(cache)
    .then(upload)
    .enqueue()

 

InputMerger

작업 체인에서 작업 요청의 출력 데이터는 다음 작업 요청의 입력 데이터로 전달된다. 위 예시처럼 여러 작업 요청을 동시에 처리해야 하는 경우 InputMerger를 사용한다. OverwritingInputMerger 또는 ArrayCreatingInputMerger를 사용할 수 있다.

  • OverwritingInputMerger
    기본값으로 사용되는 InputMerger. 키 충돌이 발생하면 나중에 입력된 데이터가 이전 데이터를 덮어 쓴다. 리스트로 전달된 작업 요청들은 동시에 실행되므로 어떤 값으로 덮어 쓰일지 순서를 보장할 수 없다.
  • ArrayCreatingInputMerger
    각 키에 대응하는 배열을 생성하는 InputMerger. 모든 키가 고유하여 충돌이 발생하지 않는다면 각 키에 대응하는 배열은 단일 성분을 포함할 것이다. 키 충돌이 발생하더라도 배열 안에서 모든 데이터가 유지된다.

 

작업 요청 체인의 상태 변화

작업 요청 체인은 상위 요청에서 시작하여 하위 요청으로 순차적으로 실행된다. 체인 내의 각 요청이 성공(ListenableWorker.Result#success()를 반환)해야 BLOCKED 상태인 하위 요청이 ENQUEUED 상태로 변경되어 이어서 실행된다.

 

 

작업 실행 시 오류가 발생하면 설정된 재시도 및 백오프 정책에 의해 재시도하며, 동시에 실행되는 다른 요청에는 영향을 미치지 않는다.

 

 

재시도 정책이 없거나 실패(ListenableWorker.Result#failure()를 반환)하는 경우 모든 하위 요청은 FAILED 상태로 완료된다.

 

 

취소되는 경우도 마찬가지로 모든 하위 요청이 CANCELLED 상태로 완료된다.

 

'Android' 카테고리의 다른 글

ViewModel 맛보기  (0) 2023.02.27
Retrofit2로 JSON 데이터 요청하기  (0) 2023.02.21
WorkManager (3) : 작업 관리하기  (0) 2022.12.05
WorkManager (2) : 작업 상태  (0) 2022.12.02
WorkManager (1) : 작업 설정/예약하기  (0) 2022.12.02