봄날은 갔다. 이제 그 정신으로 공부하자

WorkManager 알아보기 본문

Android jetpack

WorkManager 알아보기

길재의 그 정신으로 공부하자 2020. 11. 23. 18:47

해당 글에서는 Android 백그라운드 서비스중 하나인 WorkManager에 대해 설명하고 간단한 사용법에 대해 가이드 합니다.

 

WorkManager란?

앱이 종료되거나 기기가 다시 시작되더라도 실행이 예상되는 연기 가능한 비동기 작업을 쉽게 예약할 수 있는 라이브러리로, 

Service와의 차이점은 앱의 process 안의 새로운 thread에서 task를 실행시킬 수 있다는 점 입니다.

WorkManager의 작업은 반드시 실행되지만 그 처리가 상황에 따라 지연 되거나 도중에 중단될 경우 다시 실행 될수 있다는 것을 꼭 기억해야 합니다. "백그라운드 처리 가이드" 문서에서 언급하였듯이, 백그라운드로 동작하는 모든 경우에 WorkManager가 적합한 것은 아닙니다.

 

WorkManager로 작업 예약

WorkManager는 지연 가능한 비동기 작업(앱이 종료 되거나 기기가 다시 시작되더라도 실행될 것으로 예상되는 작업)을 쉽게 예약할 수 있는 API입니다. WorkManager API는 FirebaseJoDispatcher, GcmNetworkManager, JobScheduler를 비롯하여 모든 이전 Android 백그라운드 예약 API를 대체한다는 점에서 권장되는 API 입니다.

내부적으로 WorkManager에서는 다음 기준에 따라 기본 작업 전달 서비스를 사용합니다.

 

 

WorkManager 지원 기능

WorkManager는 기존 백그라운드 지원 API에 비해 더 간단하고 일관된 API를 제공할 뿐만 아니라 여러 장점을 가지고 있습니다.

WorkManager는 앱 프로세스가 사라지더라도 안전하게 종료할 수 있는 진행 중인 백그라운드 작업 또는 즉시 실행해야 하는 작업을 대상으로 하지 않습니다. WorkManager는 앱이 종료되어나 기기가 다시 시작되더라도 지연 가능하고 안정적으로 실행되어야 하는 아래와 같은 작업을 대상으로 설계 되었습니다.

  • 백엔드 서비스에 로그 또는 분석을 전송
  • 주기적으로 앱 데이터를 서버와 동기화

 

WorkManager 시작하기

WorkManager를 사용하면 작업을 쉽게 설정하고 시스템에 전달하여 지정한 조건에서 실행 할 수 있습니다.

해당 글에서는 프로젝트에 WorkManager를 추가하고 백그라운드 동작을 위해 시스템에 전달하는 방법에 대해 설명합니다.

  • Android 프로젝트에 WorkManager 추가
  • 백그라운드 작업 만들기
  • 작업 실행 방법 및 시기 구성
  • 시스템에 작업 전달

 

프로젝트에 WorkManager 추가

프로젝트에 맞게 자바 또는 Kotlin의 WorkManager 종속성을 아래와 같이 프로젝트의 build.gradle 파일에 추가합니다.

dependencies {

    def work_version = "2.4.0"

    // (Java only)

    implementation "androidx.work:work-runtime:$work_version"

    // Kotlin + coroutines

    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support

    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support

    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers

    androidTestImplementation "androidx.work:work-testing:$work_version"

}

작업 정의

Worker class를 상속받는 작업 클래스를 만들어 doWork() 함수 재정의가 필요합니다.

doWork() 함수는 WorkManager에서 제공하는 백그라운드 Thread에서 Sync로 실행됩니다.

class UploadWorker(appContext: Context, workerParams: WorkerParameters)

    : Worker(appContext, workerParams) {

    override fun doWork(): Result {

        // Do the work here--in this case, upload the images.

        uploadImages()

        // Indicate whether the task finished successfully with the Result

        return Result.success()

    }

}

 

doWork() 함수는 Result 값을 반환해 WorkManager에 결과를 전달합니다.

  • Result.success() // 작업 성공
  • Result.failure() // 작업 실패
  • Result.retry() // 나중에 재시도 필요.

 

작업 실행 방법 및 시기 구성 (WorkRequest 만들기)

Worker는 작업 단위를 정의하고 WorkRequest는 작업이 언제 어떻게 실행되어야 하는지 정의해야 합니다.

작업은 일회성이거나 주기적일 수 있으며, 일회성 WorkRequest의 경우, OneTimeWorkRequest를 사용하고

주기적인 작업의 경우, PeriodicWorkRequest를 사용해야 합니다.

UploadWorker에 WorkRequest를 빌드하는 방법은 아래와 같습니다.

val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>().build()

 

WorkRequest에는 추가 정보(실행 제약 조건, 작업 입력, 지연, 작업 재시도 정책)도 포함될 수 있습니다.

 

System에 WorkRequest 제출

WorkRequest를 정의했다면 이제 enqueue() 함수를 사용해 WorkManager와 함께 일정을 정할 수 있습니다.

WorkManager.getInstance(myContext).enqueue(uploadWorkRequest)

 

Worker가 실행될 정확한 시간은 WorkRequest에 사용되는 제약 조건과 시스템 최적화에 따라 달라지며 WorkManager는

이러한 제한사항 아래서 최상의 동작을 제공하도록 설계되었습니다.

Comments