WorkManager에 대해서는 전 게시물에서 다뤄봤다.
다시 정리하자면,
앱이 종료되거나 다시 시작되어도 비동기 작업을 쉽게 예약할 수 있게 해준다.
안드로이드의 백그라운드 작업을 처리하는 방법 중 하나이며 지금 공부하고 있는 JetPack의 구성 요소 중 하나이다.
전 게시물에서는 WorkManager 간단한 실습을 통해 어떻게 다뤄지는지 알아봤고
이번 글에서는 Worker와 데이터를 주고받는 실습을 해볼 것이다!!
먼저 MainActiviy에서 WorkManager로 전달할 데이터를 다음과 같이 정해준다.
val myData : Data = workDataOf(
"a" to 10,
"b" to 20
)
val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().setInputData(myData).build()
WorkManager.getInstance(this).enqueue(workManagerB)
WorkRequest에 setInputData()를 통해 데이터를 보낼 수 있으며 이 때 Data를 만들 때에는 .build()를 사용한다.
다음, WorkManager인스턴스를 담아 enqueue메소드를 이용하여 workManagerB에 데이터를 전달한다.
class WorkManagerB(context : Context, workerParameters: WorkerParameters) :
Worker(context, workerParameters){
override fun doWork(): Result {
val a = inputData.getInt("a", 1000)
val b = inputData.getInt("b", 2000)
val c = inputData.getInt("c", 3000)
Log.d("WorkManagerB", a.toString())
Log.d("WorkManagerB", b.toString())
Log.d("WorkManagerB", c.toString())
//c는 값이 없기 때문에 디폴트값인 3000이 찍힘
위와 같이 WorkManagerB에서 받은 데이터를 inputData.getInt로 확인한다.
a의 값은 10, b의 값은 20으로 전달했기 때문에 디폴트값이 1000, 2000이라고 하더라도 받은 데이터가 10, 20이기 때문에
로그에 10, 20이 찍히는 것을 확인할 수 있다.
하지만 c라는 데이터를 받지 않았기 때문에 c는 디폴트값인 3000이 로그에 찍히게 된다.
이렇게 받은 데이터를 완료하고 난 다음에 데이터를 다시 WorkManager에서 넘겨주고 싶을때 output을 적어줄 수 있다.
val output : Data = workDataOf(
"result" to 10
)
return Result.success(output)
MainActivity에서 다음과 같이 받을 수 있다.
WorkManager.getInstance(this).getWorkInfoByIdLiveData(workManagerB.id)
.observe(this, Observer { info ->
if(info != null && info.state.isFinished){
val result = info.outputData.getInt("result", 10000)
val result2 = info.outputData.getInt("result", 20000)
Log.d("MainActivity", result.toString())
Log.d("MainActivity", result2.toString())
}
})
이렇게 WorkManager에서 데이터를 보낼 때 WorkInfo형태로 넘기며 이는 LiveData에 속해 Observe를 통해 관찰이 가능하다.
위의 코드에서 state를 확인할 수 있는데 state는
WorkRequest의 id와 해당 WorkRequest의 현재 상태를 담는 클래스이며, 상태정보를 이용해서 자신이 요청한 작업의 현재 상태를 파악할 수 있다.
따라서 info가 null이 아니거나 상태가 끝이 났을 때, 위와 같이 데이터를 확인하고 싶은 것이다.
result라는 값은 10으로 받지만 현재 result2의 값은 받지 않는다. 따라서 10과 디폴트값인 20000이 로그에 찍히는 것을 확인할 수 있다.
비동기 작업에 효율적인 작업이라고 하는데, 아직 WorkManager에 대한 공부가 좀 부족한 것 같다..ㅠㅠ
이해가 안가는 부분도 아직 있어 코루틴하고 좀 활용하여 써봐야겠다.
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] WorkManager(4) + 작업진행률 관찰 (0) | 2022.09.14 |
---|---|
[JETPACK개론] WorkManager(3) + Chaining, Coroutine (0) | 2022.09.09 |
[JETPACK개론] WorkManager(1) (4) | 2022.09.07 |
[JETPACK개론] ROOM(3) (0) | 2022.09.05 |
[JETPACK개론] ROOM(2) (0) | 2022.09.03 |