WorkManager의 Chaining 사용법

최대환·2023년 12월 31일
0

안드로이드에서 제공하는 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를 실행시키는 방법은 뭘까요?
아래코드와 같이 beginWiththen을 통해 코드를 작성합니다.

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를 순차적으로 실행시킬 수 있습니다.

profile
나의 개발지식 output 공간

0개의 댓글