WorkManager

노준혁·2023년 1월 10일
0

https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko
https://dongsik93.github.io/til/2020/05/15/til-jetpack-workmanager/
https://medium.com/@limgyumin/새로운-안드로이드-백그라운드-작업-처리법-workmanager-f625e07b384c
https://velog.io/@hyeryeong/Android-WorkManager-공부해보기


  • WorkManager

    • 2018년 구글 I/O 에서 발표된 안드로이드 백그라운드 작업 WorkManager

    • WorkManager 는 Android Jetpack 의 아키텍처 구성요소

    • 앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아 있다면 이 작업들은 persistent하게 유지됨.

    • 백그라운드 작업은 persistent work을 통해 처리될 때 가장 적합하므로, WorkManager는 백그라운드 작업에서 권장되는 기본 API

    • WorkManager는 사용자가 화면을 벗어나 이동하거나, 앱이 종료되거나, 기기가 다시 시작되더라도 안정적으로 실행되어야 하는 작업을 대상으로 설계됨.

      • 다음과 같은 작업들을 수행할 때 효과적
      • 백엔드 서비스에 logs 또는 analytics 전송 (데이터 분석 후 DB에 분석 결과를 저장하는 작업)
      • 주기적으로 서버와 애플리케이션 데이터를 동기화 (image를 서버에 업로드)
    • 사용자가 앱을 사용하지 않을때도 수행해야 하는 작업들이 있는 경우는 매우 까다로움 -> 이러한 경우를 WorkManager를 통해 어느정도 해결 가능

    • 앱의 프로세스 수명과 별도로 살아남기 위한 작업에 사용하는 것이 좋음


  • 코루틴과의 차이, 관계점
    • 코루틴은 persistent work(지속적인 작업)에 사용하면 안됨.
    • 코루틴은 concurrency framework(동시 실행 프레임워크)이고 WorkManager는 지속적인 작업을 위한 라이브러리라는 점에서 차이

  • WorkManager가 처리하는 persistent Work 유형
      1. Immediate :
        -> 1번만 수행
        즉시 시작하고 곧 완료해야 하는 작업.
        신속하게 처리 가능
      1. Long Running :
        -> 1번 혹은 주기적으로 수행할 작업 예약 가능
        오래 실행될 수 있는 작업
      1. Deferrable : (사전적 정의: 연기할 수 있는)
        -> 1번 혹은 주기적으로 수행할 작업 예약 가능
        나중에 시작하며 주기적으로 실행될 수 있는 예약된 작업
        작업을 원하는 시점에 실행될 수 있도록 예약할 수 있음.

  • 특징

    • Work constraints (작업 제약 조건)
      Work constarints를 설정함으로써 최적으로 작업을 처리하는 조건을 셋팅해줄 수 있음.
      For example, run only when the device is on an unmetered network(무제한 네트워크), when the device is idle(작업중이지 않은 상태), or when it has sufficient battery.

    • Robust scheduling (강력한 예약 관리)

    1. WorkManager를 통해 flexible한 예약 기간 설정을 통해 1회 혹은 주기적으로 반복실행할 작업을 예약할 수 있음.
    2. Scheduled work들은 내부적으로 관리되는 SQLite DB에 저장되며, WorkManager에서는 기기를 재부팅해도 작업이 유지되고 다시 rescheduled되게끔 보장함.
    3. WorkManager는 절전 기능을 사용 -> 권장사항(예: 잠자기 모드)을 준수 -> 배터리 소모 적음
    • Expedited work (신속 처리 작업)
      WorkManager를 사용하여 백그라운드에서 즉시 실행할 작업을 schedule 가능.
      사용자가 몇 분 내에 완료해야 되는 작업에는 Expedited work 사용

    • Flexible retry policy (유연한 재시도 정책)
      Sometimes work fails. WorkManager offers flexible retry policies, including a configurable exponential backoff policy.

    • Work chaining (작업 체이닝)
      복잡하게 관련되어있는 작업의 경우, 직관적인 인터페이스를 통해 개별 작업을 묶어 체이닝하면 순차적으로 실행할 작업과 동시에 실행할 작업을 제어 가능
      작업A 의 결과에 따라 B or C 를 선택하여 처리하고 D 를 이어서 처리하는 등의 작업 연결 처리가 가능

    • Built-In threading interoperability (내장 스레딩 상호 운용성)
      WorkManager는 코루틴 및 RxJava와 원활하게 통합되며 자체 비동기 API를 연결할 수 있는 유연성을 제공


  • API

  • WorkManage API

    • WorkManage :
      처리해야 하는 작업을 자신의 큐에 넣고 관리
      싱글톤 객체이기에 getInstance()를 통해 WorkManager 객체를 반환받아 사용

    • Worker :
      추상 클래스
      Worker 클래스를 상속받은 후 수행할 백그라운드 작업을 doWork()에 오버라이딩
      doWork()의 결과에 따라, SUCCESS(해당 작업 마무리), FAILURE(실패 중단), RETRY(재시도) 3개 중 하나 리턴

    • WorkRequest :
      WorkManager를 통해 실제 요청하게 될 개별 작업
      1. OneTimeWorkRequest

      1. PeriodicWorkRequest
    • WorkState :
      WorkRequest의 id와, 해당 WorkRequest의 현재 상태를 담는 클래스
      WorkState를 보고 예약된 작업의 현재 상태 파악 가능


  • build.gradle
implementation ("androidx.work:work-runtime-ktx:2.7.1")

중복 작업을 방지하려면 작업을 큐에 추가할 때 주의하시기 바랍니다. 예를 들어 앱에서 24시간마다 백엔드 서비스에 로그를 업로드하려고 시도할 수 있습니다. 한 번만 실행해야 하는 작업임에도 동일한 작업이 여러 번 큐에 추가될 수 있으므로 주의해야 합니다. 한 번만 큐에 추가하려면 작업을 고유 작업으로 예약하면 됩니다.



profile
https://github.com/nohjunh

0개의 댓글