반응형
이 포스트는 2021.12~2022.09 기간동안 벨로그에 작성한 글을 티스토리에 옮겨 적은 것입니다.
함수를 백그라운드에서 실행하려면 WorkManager가 필요하다.
알아야 할 WorkManager 클래스들
- Worker: 백그라운드에서 실행하고자 하는 코드를 여기에 입력. 이 클래스를 확장하고 doWork() 메서드를 재정의한다.
- WorkRequest: 작업 실행 요청. WorkRequest를 만드는 과정에서 Worker를 전달한다.
- WorkManager: 실제로 WorkRequest를 예약하고 실행하는 클래스. 지정된 제약 조건을 준수하면서 시스템 리소스에 부하를 분산하는 방식으로 WorkRequest를 예약한다.
두 가지 WorkRequest 유형
- OneTimeWorkRequest: 한 번만 실행되는 WorkRequest
- PeriodicWorkRequest: 일정 주기로 반복하는 WorkRequest
작업 체이닝
WorkManager를 사용하면 순서대로 실행되거나 동시에 실행되는 별도의 WorkerRequest를 만들 수 있다. 실습의 작업 체인을 나타내면 대충 이렇다. 한 WorkRequest의 출력이 체인 내 다음 WorkRequest의 입력이 된다.
WorkerRequest 하나인 경우
val blurRequest = OneTimeWorkRequestBuilder<BlurWorker>()
.setInputData(createInputDataForUri())
.build()
workManager.enqueue(blurRequest)
WorkRequest 객체 세 개(workA, workB, workC)가 있는 경우
val continuation = workManager.beginWith(workA)
continuation.then(workB) new WorkContinuation instance
.then(workC)
.enqueue()
workManager.enqueue()를 호출하는 대신 workManager.beginWith()를 호출한다.
고유 작업 체인
작업 체인을 한 번에 하나씩만 실행해야 하는 경우가 있다. 이렇게 하려면 beginWith 대신 beginUniqueWork를 사용한다.
사용 예
var continuation = workManager
.beginUniqueWork(
IMAGE_MANIPULATION_WORK_NAME,
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest.from(CleanupWorker::class.java)
)
반응형
댓글