LiveData를 사용하다 보면 여러 가지의 데이터를 다루게 되고, 이러한 데이터들이 함께 바껴야하는 상황도 많이 만나게 된다.
데이터베이스와 네트워크 통신을 도와주는 라이브러리와 함께 사용되기도 하는데
이 때 Transformation의 Map과 SwitchMap 메소드를 사용한다!!
간단한 실습을 통해 이 두 가지를 알아보자!
EditText에 숫자를 입력하고 버튼을 누르면 자동으로 그 숫자끼리 더해지고, 곱해지는 프로그램을 구현해보자.
예를 들어, 10을 입력하면 20과 100이 출력되는 것이다.
위의 메소드를 모두 이용한다고하면, 10이라는 라이브데이터로 20과 100으로 변환시키는 것에서 이용할 수 있을 것이다!
private var _mutableCount = MutableLiveData(0)
val liveCount : LiveData<Int>
get() = _mutableCount
fun setLiveDataValue(count : Int){
_mutableCount.value = count
}
위와 같이 ViewModel을 만들어주고,
binding.btnArea.setOnClickListener {
val count = binding.inputArea.text.toString().toInt()
viewModel.setLiveDataValue(count)
}
버튼을 클릭했을 때 LiveData의 값에 10을 넣어보자!
물론 여기서 다음과 같이 Activity클래스에서 설정하여 데이터를 변화시킬 수 있다.
viewModel.liveCount.observe(this, Observer {
//이를 ViewModel에서 하고 싶다는 생각이 들었음
// binding.resultArea1.text = (it+it).toString()
// binding.resultArea2.text = (it*it).toString()
})
하지만, 우리는 LiveData를 ViewModel에서 다루고 있었고, 이 데이터를 변경하는 것 또한 ViewModel에서 하는 것을 원했다.
따라서 다음과 같이 ViewModel에 추가해주었다!
Map
val mapLiveData = Transformations.map(liveCount){
it+it
}
Transformations의 map메소드를 통해 값을 변경해주었고, 액티비티에서 observer를 통해 다음과 같이 텍스트까지 변경을 완료했다!
viewModel.mapLiveData.observe(this, Observer {
binding.resultArea1.text = it.toString()
})
이제 SwitchMap도 사용해보자!
SwitchMap
val switchLiveData = Transformations.switchMap(liveCount){
changeValue(it)
}
fun changeValue(count : Int) : MutableLiveData<Int> {
val testLiveData = MutableLiveData(count * count)
return testLiveData
}
}
ViewModel에 위의 코드를 추가해주어 해당 liveData의 값을 제곱하는 변형데이터를 return하는 함수를 만들어준다.
이도 마찬가지로 다음과 같이 액티비티에 추가해주면 끝!!
viewModel.switchLiveData.observe(this, Observer {
binding.resultArea2.text = (it).toString()
})
간단히 Map과 SwitchMap을 사용해봤는데, 이 둘의 정확한 차이점을 모르겠다....
더 관련된 문서를 찾아보면서 따로 정리하는 글을 포스팅해야겠다!!!!!!!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] Retrofit (0) | 2022.08.24 |
---|---|
[JETPACK개론] DataBinding + ViewModel + LiveData (0) | 2022.08.21 |
[JETPACK개론] Fragment LiveData / LifeCycleOwner (0) | 2022.08.19 |
[JETPACK개론] LiveData 와 MutableLiveData (0) | 2022.08.18 |
[JETPACK개론] LiveData (0) | 2022.08.17 |