경험의 기록

https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko 

 

앱 아키텍처: 데이터 영역 - WorkManager로 작업 예약 - Android 개발자  |  Android Developers

데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 지속적인 작업 유형과 기능 등을 알아보세요.

developer.android.com

안드로이드에서 지속적인 작업을 진행할 경우, WorkManager를 사용해야 한다.

여기서 말하는 지속적인 작업이란

 

1️⃣ 즉시 실행 : 즉시 시작하고 곧 완료해야 하는 작업. 신속처리 제공

2️⃣ 장기 실행 : 오래(ex - 10분 이상) 실행되는 작업

3️⃣ 지연 가능 : 나중에 시작하거나 주기적으로 실행될 수 있는 예약된 작업

 

의 3가지 경우를 말한다.

 

WorkManager는 앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아 있으면 그 작업은 유지된다.

즉, WorkManager는 반드시 실행된다.

 

이 글에선 지연 가능(주기적 작업)한 작업을 위한 WorkManager를 사용해보려고 한다.

 


1️⃣ Dependency 추가

dependencies {
    def work_version = "2.7.1"
    
    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"
}

https://developer.android.com/topic/libraries/architecture/workmanager/basics?hl=ko 

 

WorkManager 시작하기  |  Android 개발자  |  Android Developers

WorkManager 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. WorkManager를 사용하기 위해 먼저 라이브러리를 Android 프로젝트로 가져옵니다. 앱의 build.grad

developer.android.com

여러 버전은 공식문서에서 확인할 수 있다.

 

 

2️⃣ Worker Class 정의

class LogWorker(appContext: Context, workerParams: WorkerParameters)
    : Worker(appContext, workerParams) {

    override fun doWork(): Result {

        Log.d("test5", "doWork: 통신")

        return Result.success()
    }
}

Worker 클래스를 상속받는 클래스를 생성하여

생성자로 Context, WorkerParameters를 넘겨준다.

그 후, 처리할 작업을 doWork 메서드를 오버라이드 하여 작성해준다.

 

1️⃣ Result.success() : 작업 성공

2️⃣ Result.failure() : 작업 실패

3️⃣ Result.retry() : 작업 실패, 재시도 정책에 따라 재시도

 

doWork메소드에서 반환하는 Result 값을 통해 WorkManager에게 성공, 실패, 재시도 여부를 알려줄 수 있다.

 

class LogWorker(appContext: Context, workerParams: WorkerParameters)
    : CoroutineWorker(appContext, workerParams) {

    override fun doWork(): Result{

        Log.d("test5", "doWork: 비동기 통신")

        return Result.success()
    }
}

비동기 통신의 경우 CoroutineWorker 클래스를 통해 진행할 수 있다.

3️⃣ 작업 요청, 취소하기

// 주기 설정. 최소 15분
private val workRequest: PeriodicWorkRequest =
    PeriodicWorkRequestBuilder<LogWorker>(15, TimeUnit.MINUTES)
        .build()

PeriodicWorkRequest를 통해 위에서 정의한 Worker 작업을 생성한다.

주기를 설정할 수 있으며 최소 주기는 15분이다.

 

workManager = WorkManager.getInstance(applicationContext)

이제 getInstance를 통해 WorkManager 객체를 생성해주고

 

// 워크매니저 시작
fun startWorkManager() {
    workManager.enqueueUniquePeriodicWork(
        UNIQUE_NAME,
        ExistingPeriodicWorkPolicy.KEEP, // 충돌 정책 : 기존 작업을 유지하고 새 작업을 무시
        workRequest
    )

    // 워크 매니저 상태 확인
    val state = workManager.getWorkInfosForUniqueWork(UNIQUE_NAME).get()
    for(i in state){
        Log.d("test5", "startWorkManager: $state")
    }
}

// 워크매니저 종료
fun stopWorkManager() {
    workManager.cancelUniqueWork(UNIQUE_NAME)

    // 워크 매니저 상태 확인
    val state = workManager.getWorkInfosForUniqueWork(UNIQUE_NAME).get()
    for(i in state){
        Log.d("test5", "stopWorkManager: $state")
    }
}

enqueueUniquePeriodicWork를 통해 특정 태그로 작업을 대기열에 enque 하여 작업을 시작할 수 있다.

또한 cancelUniqueWork를 통해 특정 태그 작업을 종료할 수 있다.

 

getWorkInfosForUniqueWork 를 사용하면 워크매니저의 상태를 확인할 수 있다.

 

 

 

 

 

전체 코드

https://github.com/HanYeop/Jetpack-Compose/tree/master/WorkManagerEx

 

GitHub - HanYeop/Jetpack-Compose: Jetpack Compose 사용해보기

Jetpack Compose 사용해보기. Contribute to HanYeop/Jetpack-Compose development by creating an account on GitHub.

github.com

 

 

참고

https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading