함수를 백그라운드에서 실행하려면 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)
)