ViewModel
위의 안드로이드 공식문서를 읽어보면 자세히 나와있지만 처음 접하는 나같은 사람들에게는 어렵게 다가올 수 있다.
정리하자면
ViewModel은 안드로이드의 생명주기를 관리하기 쉽게한다.
다시말해, UI컨트롤러(Activity, Fragment)에서 모든 것을 다 하려고 하면 복잡해지는데,
ViewModel을 사용하면 테스트나 관리가 용이해진다.
먼저 간단하게 Activity에서 ViewModel을 사용해보면서 이해해보자!!
위의 그림을 이해하기 위해 다음과 같이 로그를 찍어보자.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainAcitivty", "onCreate")
override fun onStart() {
super.onStart()
Log.d("MainAcitivty", "onStart")
}
override fun onResume() {
super.onResume()
Log.d("MainAcitivty", "onResume")
}
override fun onPause() {
super.onPause()
Log.d("MainAcitivty", "onPause")
}
override fun onStop() {
super.onStop()
Log.d("MainAcitivty", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("MainAcitivty", "onDestroy")
}
먼저 처음 앱을 실행하게 되면
이렇게 로그가 찍히는 것을 확인할 수 있다.
하지만 앱을 종료하거나, 앱을 다음과 같이 회전을 하게 되면
위와 같이 로그가 찍힌다.
여기서 생기는 문제점은 다음과 같이 plus를 누르면 숫자가 올라가고 minus를 누르면 숫자가 내려가는 view가 있다고 가정했을 때
앱을 회전하게 되면 onStop이 실행되면서 데이터가 사라지게 된다.
따라서 우리는 ViewModel을 사용해서 생명주기를 쉽게 관리할 수 있다!! 위의 구글 공식문서 사진처럼 계속해서 보존할 수 있다.
다음과 같이 ViewModel을 만들어보자!!
class MainViewModel : ViewModel(){
var countValue = 0
fun plus(){
countValue++
Log.d("MainViewModel", countValue.toString())
}
fun minus(){
countValue--
Log.d("MainViewModel", countValue.toString())
}
}
확인을 위해 로그를 찍어보자!
다음 액티비티 클래스에서
lateinit var viewModel: MainViewModel
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
plusBtn.setOnClickListener{
viewModel.plus()
resultArea.text = viewModel.countValue.toString()
// countValue++
// resultArea.text = countValue.toString()
}
추가해주면 끝!!! 화면을 돌려 onStop, onDestroy가 실행이 되어도 데이터는 여전히 유지되고 있음을 확인할 수 있다!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] ViewModelFactory (0) | 2022.08.16 |
---|---|
[JETPACK개론] Activity/Fragment 의 ViewModel 공유 (0) | 2022.08.12 |
[JETPACK개론] View,DataBinding + Adapter (0) | 2022.08.10 |
[JETPACK개론] DataBinding 과 data class (0) | 2022.07.26 |
[JETPACK개론] ViewBinding (0) | 2022.07.24 |