배경
- 안드로이드가 점점 진화하며 어느 순간부터 백그라운드 작업이 수월하지 않게 되었다.
- 초기에는 Service를 이용해서 작업하거나 Broadcast Receiver를 통하여 프로세스를 깨우는 것 또한 쉽게 가능했다.
- 하지만 안드로이드 M(API 23)부터 백그라운드 작업을 위한 제약 사항들이 추가되며, 개발자들은 여러 API를 통하여 추가 코드 작성이 필요해졌다.(즉 불가능한 것은 아니지만 까다로워졌다.)
WorkManager 정의
- WorkManager는 비동기 작업을 쉽게 예약할 수 있는 API로 모든 Android 백그라운드 스케줄링 API를 대체할 수 있습니다.
- 사용자가 화면을 끄거나 앱을 종료하거나 디바이스를 리부팅할지라도 안정적으로 실행할 수 있는 작업을 위한 것입니다.
- 프로세스 종료 여부와 관계없이 반드시 작업을 실행한다. 하지만 작업이 즉시 실행되는 것을 보장하지 않습니다.
- 서버에 로그 또는 분석 데이터를 전송하거나 주기적으로 로컬 데이터를 서버와 동기화하는 작업, 이미지 저장 및 업로드 등의 작업이라면 WorkManager 사용을 선택해도 좋다.
- WorkManager는 유저가 보고있는 UI를 빠르게 변경해야 하는 작업이나 물건 구입 과정에서의 결제 진행 등즉시 처리해야 하는 작업을 위한 것이 아닙니다.
WorkManager 특징
- 작업 제약 조건
- 강력한 스케줄링
- 유연한 재시도
- 작업 Chaining
- 스레딩 상호 운용
WorkManager 구성
- Worker
- 작업 내용을 가지는 Abstract class
- 클래스를 상속받고 백그라운드에서 실행하고자 하는 코드를 doWork()에 정의한다.
- 작업 상태를 나타내는 Result에 정의된 success(), failure(), retry() 등의 메서드를 통해 결과를 반환한다. 반환된 값에 따라서 이후 동작을 결정할 수 있다.
- Result.Success / Result.Failure / Result.Retry
//하고자하는 작업 코드 작성
class SomeWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
Thread.sleep(3000)
Result.success()
} catch (e: Exception) {
Result.failure()
}
}
}
- WorkRequest
- Worker에 정의된 task를 작동시키기 위한 request를 나타낸다.
- WorkRequest를 생성할 때 반복 여부, 제약 사항 등의 정보를 담는다.
- OneTimeWorkRequest : 한번만 실행할 작업 요청을 나타내는 WorkRequest
- PeriodicWorkRequest : 일정 주기로, 여러번 실행할 작업 요청을 나타내는 WorkRequest
//OnetimeWorkRequest
val workRequest = OneTimeWorkRequestBuilder<SomeWorker>().build()
//PeriodicWorkRequest
val workRequest2 = PeriodicWorkRequestBuilder<SomeWorker>(15, TimeUnit.MILLISECONDS)
.build()
- WorkManager
- 실제로 WorkRequest를 스케줄링하고 실행하며 관리하는 클래스
- 인스턴스를 받아와 WorkRequest를 큐에 추가하여 실행하도록 한다.(enqueue)
val workManager = WorkManager.getInstance(application)
workManager.enqueue(workRequest)