Android/WorkManager
WorkManager Chaining
${Harvey}
2022. 11. 21. 22:25
- A와B는 무엇이 먼저 실행되던 상관이 없으나 C는 무조건 A/B 모두 실행되고 실행되어야 하는, 이러한 상황에 사용하는 코드
build.gradle
implementation("androidx.work:work-runtime-ktx:2.7.1")
MainActivity.kt
// WorkManager Chaining
// A -> 순서 상관 없이 실행되도 괜찮음
// B -> 순서 상관 없이 실행되도 괜찮음
// C -> 무조건 A / B 모두 실행 된 뒤에 실행되어야 한다
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.kt
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()
}
}
WorkManagerB.kt
class WorkManagerB(context : Context, workerParameters: WorkerParameters) : Worker(context, workerParameters){
override fun doWork(): Result {
for(i in 0..3) {
Thread.sleep(1000)
Log.d("WorkManagerB", i.toString())
}
return Result.success()
}
}
WorkManagerC.kt
class WorkManagerC (context : Context, workerParameters: WorkerParameters) : Worker(context, workerParameters){
override fun doWork(): Result {
for(i in 0..3) {
Thread.sleep(1000)
Log.d("WorkManagerC", i.toString())
}
return Result.success()
}
}
결과: A와 B가 실행된 후 C가 실행된다.
