안드로이드에서 제공하는 WorkManager의 Chaining기능에 대해 코드실습을 통해 알아보겠습니다.
기존에는 아래와같이 여러 WorkManager를 동시에 실행시키는 방식을 사용했습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val workManagerA = OneTimeWorkRequestBuilder<WorkManagerA>().build()
val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().build()
val workManagerC = OneTimeWorkRequestBuilder<WorkManagerC>().build()
WorkManager.getInstance(this).enqueue(workManagerA)
WorkManager.getInstance(this).enqueue(workManagerB)
WorkManager.getInstance(this).enqueue(workManagerC)
}
}
이렇게 하면 WorkManagerA, WorkManagerB, WorkManagerC가 아래 로그에서 보듯이 동시에 실행됩니다.
2023-12-31 21:00:24.355 3454-3605 WorkManagerA com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:00:24.387 3454-3611 WorkManagerB com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:00:24.391 3454-3612 WorkManagerC com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:00:25.355 3454-3605 WorkManagerA com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:00:25.387 3454-3611 WorkManagerB com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:00:25.391 3454-3612 WorkManagerC com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:00:26.355 3454-3605 WorkManagerA com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:00:26.388 3454-3611 WorkManagerB com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:00:26.392 3454-3612 WorkManagerC com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:00:27.356 3454-3605 WorkManagerA com.choidaehwan.workmanagerchaining D 3
2023-12-31 21:00:27.390 3454-3611 WorkManagerB com.choidaehwan.workmanagerchaining D 3
2023-12-31 21:00:27.393 3454-3612 WorkManagerC com.choidaehwan.workmanagerchaining D 3
그렇다면 WorkManagerA와 WorkManagerB가 실행이 완료한 후에 WorkManagerC를 실행시키는 방법은 뭘까요?
아래코드와 같이 beginWith
과 then
을 통해 코드를 작성합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val workManagerA = OneTimeWorkRequestBuilder<WorkManagerA>().build()
val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().build()
val workManagerC = OneTimeWorkRequestBuilder<WorkManagerC>().build()
// WorkManager.getInstance(this).enqueue(workManagerA)
// WorkManager.getInstance(this).enqueue(workManagerB)
// WorkManager.getInstance(this).enqueue(workManagerC)
WorkManager.getInstance(this)
.beginWith(listOf(workManagerA, workManagerB))
.then(workManagerC)
.enqueue()
}
}
이렇게 작성하면 WorkManagerA와 WorkManagerB가 모두 완료된 후에 WorkManagerC가 실행됩니다. 이걸 WorkManager Chaining이라고 합니다. 아래는 그 로그입니다.
2023-12-31 21:05:28.169 7324-7378 WorkManagerB com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:05:28.170 7324-7377 WorkManagerA com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:05:29.170 7324-7378 WorkManagerB com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:05:29.171 7324-7377 WorkManagerA com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:05:30.170 7324-7378 WorkManagerB com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:05:30.172 7324-7377 WorkManagerA com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:05:31.173 7324-7378 WorkManagerB com.choidaehwan.workmanagerchaining D 3
2023-12-31 21:05:31.173 7324-7377 WorkManagerA com.choidaehwan.workmanagerchaining D 3
2023-12-31 21:05:31.176 7324-7375 WM-WorkerWrapper com.choidaehwan.workmanagerchaining I Worker result SUCCESS for Work [ id=e4da4a05-c726-47ed-9c68-0c13bf432520, tags={ com.choidaehwan.workmanagerchaining.WorkManagerB } ]
2023-12-31 21:05:31.183 7324-7375 WM-WorkerWrapper com.choidaehwan.workmanagerchaining I Worker result SUCCESS for Work [ id=20493616-e2b3-4520-8be8-5b66b156dae1, tags={ com.choidaehwan.workmanagerchaining.WorkManagerA } ]
2023-12-31 21:05:31.188 7324-7375 WM-WorkerWrapper com.choidaehwan.workmanagerchaining I Setting status to enqueued for 34d079e5-5c3a-4dc6-9e49-75ae42c32d79
2023-12-31 21:05:32.220 7324-7383 WorkManagerC com.choidaehwan.workmanagerchaining D 0
2023-12-31 21:05:32.792 7324-7384 ProfileInstaller com.choidaehwan.workmanagerchaining D Installing profile for com.choidaehwan.workmanagerchaining
2023-12-31 21:05:33.222 7324-7383 WorkManagerC com.choidaehwan.workmanagerchaining D 1
2023-12-31 21:05:34.223 7324-7383 WorkManagerC com.choidaehwan.workmanagerchaining D 2
2023-12-31 21:05:35.227 7324-7383 WorkManagerC com.choidaehwan.workmanagerchaining D 3
이렇게 Chaining기능을 이용하면 여러 WorkManager를 순차적으로 실행시킬 수 있습니다.