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가 실행된다.