WorkManager Chaining
WorkManager의 첫 글에서 작업순서를 정해주기도 한다고 하였다.
예를 들어
작업 A, B, C가 있다고 가정해보자.
A, B 는 순서 상관 없이 실행되도 괜찮지만
C는 무조건 A / B가 모두 실행된 뒤에 실행되어야 한다고 한다면 작업순서를 정해줄 수 있어야 한다.
다음과 같은 WorkManager를 B, C까지 만들어주자.
class WorkManagerA(context : Context, workerParameters: WorkerParameters) : Worker(context, workerParameters) {
override fun doWork(): Result {
for(i in 0..3){
sleep(1000)
Log.d("WorkManagerA", i.toString())
}
return Result.success()
}
}
위와 같은 WorkManager가 B, C가 있다고 가정해보자.
val workManagerA = OneTimeWorkRequestBuilder<WorkManagerA>().build()
val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().build()
val workManagerC = OneTimeWorkRequestBuilder<WorkManagerC>().build()
여기서 MainActivity에서는 다음과 같이 순서를 정의해줄 수 있다.
WorkManager.getInstance(this)
.beginWith(listOf(workManagerA, workManagerB))
.then(workManagerC)
.enqueue()
보통 getInstance(this).enqueue를 통해 실행하였지만 위와 같이
.beginWith를 통해 먼저 실행될 작업들을 적어주고
.then을 통해 그 다음 실행되어야 할 작업을 적어준 뒤, .enqueue()를 통해 실행한다면 다음과 같이
목적대로 순서에 맞게끔 실행되는 것을 확인할 수 있다!!

WorkManager + Coroutine
안드로이드 공식문서를 확인해보면 WorkManager는 kotlin 사용자게에 코루틴을 위한 지원을 제공한다고 나와있다.
따라서 WorkManager와 코루틴을 같이 사용하는 간단한 실습을 진행해보자.
원래 기존의 WorkManager를 다음과 같이 선언해주었다.
class WorkManager1(context : Context, workerParameters: WorkerParameters) : Worker(context, workerParameters) {
override fun doWork(): Result {
return Result.success()
}
}
Worker를 상속받아 WorkManager를 만들어줬지만 코루틴과 같이 사용하는거라면 CoroutineWorker를 상속받아야 한다.
class WorkManager2(context : Context, params : WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
//Dispatchers 가 디폴트인데 이것을 이렇게 변경해줄 수 있음
withContext(Dispatchers.IO) {
test1()
test2()
}
return Result.success()
}
suspend fun test1(){
for(i in 1..3){
delay(1000)
Log.d("WorkManager2 test1", i.toString())
}
}
suspend fun test2(){
for(i in 1..3) {
delay(1000)
Log.d("WorkManager2 test2", i.toString())
}
}
}
이제 오버라이드한 doWork메소드가 suspend가 된 것을 확인할 수 있다.
왜냐하면 코루틴을 사용하기 때문이다.
public open val coroutineContext: CoroutineDispatcher = Dispatchers.Default
CoroutineWorker에 들어가보면 Dispatchers가 default로 되어있는데
이를 위에 WorkManager에서 Dispatchers의 속성을 변경시켜 줄 수 있다.

위와 같이 로그도 잘 찍히는 것을 확인할 수 있다!!
WorkManager Chaining
GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library
Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.
github.com
WorkManager + Coroutine
GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library
Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.
github.com
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] WorkManager(5) + 주기적작업, 고유작업 (0) | 2022.09.17 |
---|---|
[JETPACK개론] WorkManager(4) + 작업진행률 관찰 (0) | 2022.09.14 |
[JETPACK개론] WorkManager(2) + Sending, Receiver Data (0) | 2022.09.08 |
[JETPACK개론] WorkManager(1) (4) | 2022.09.07 |
[JETPACK개론] ROOM(3) (0) | 2022.09.05 |