WorkManager에 대해

최희창·2022년 6월 19일
0

Android AAC

목록 보기
5/13

배경

  • 안드로이드가 점점 진화하며 어느 순간부터 백그라운드 작업이 수월하지 않게 되었다.
  • 초기에는 Service를 이용해서 작업하거나 Broadcast Receiver를 통하여 프로세스를 깨우는 것 또한 쉽게 가능했다.
  • 하지만 안드로이드 M(API 23)부터 백그라운드 작업을 위한 제약 사항들이 추가되며, 개발자들은 여러 API를 통하여 추가 코드 작성이 필요해졌다.(즉 불가능한 것은 아니지만 까다로워졌다.)

WorkManager 정의

  • WorkManager는 비동기 작업을 쉽게 예약할 수 있는 API로 모든 Android 백그라운드 스케줄링 API를 대체할 수 있습니다.
  • 사용자가 화면을 끄거나 앱을 종료하거나 디바이스를 리부팅할지라도 안정적으로 실행할 수 있는 작업을 위한 것입니다.
  • 프로세스 종료 여부와 관계없이 반드시 작업을 실행한다. 하지만 작업이 즉시 실행되는 것을 보장하지 않습니다.
  • 서버에 로그 또는 분석 데이터를 전송하거나 주기적으로 로컬 데이터를 서버와 동기화하는 작업, 이미지 저장 및 업로드 등의 작업이라면 WorkManager 사용을 선택해도 좋다.
  • WorkManager는 유저가 보고있는 UI를 빠르게 변경해야 하는 작업이나 물건 구입 과정에서의 결제 진행 등즉시 처리해야 하는 작업을 위한 것이 아닙니다.

WorkManager 특징

  1. 작업 제약 조건
  2. 강력한 스케줄링
  3. 유연한 재시도
  4. 작업 Chaining
  5. 스레딩 상호 운용

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)
profile
heec.choi

0개의 댓글