-
Android Architecture Components #2 - ViewModelAndroid/AAC 2019. 7. 31. 15:46
Android Arcitecture Component 중 한개인 ViewModel에서 알아보자
ViewModel은 MVVM 공부를 하면서 알아보았던 개념인데
View와 Model사이에서 징검다리 역할과 View의 추상 개념으로 View가 가지고 있어야 할 데이터를
ViewModel에서 가지고 있어 View의 역할을 충실히 만들자는 것이 목표이다
그래서 이러한 ViewModel의 구현을 도와주고자 나온것이 ViewModel...!?
이름이 똑같아서 헷갈리기는 하나 전혀 다른 존재인거를 명심하자
ACC ViewModel의 특징은 화면 회전시 데이터를 유지해준다는 점이다
안드로이드에서 화면을 돌리면 OnDestroy -> OnCreate가 되어 가지고 있던 데이터를 다 날리는 셈이 된다.
예를 들면 버튼을 클릭하면 카운팅 되는 앱에서 세로 모드에서 100까지 올리고 가로 모드로 회전을 하면 숫자가 0으로 리셋이 되듯 말이다...
회전 후 데이터를 다시 리턴을 받기위해 상당시간 소요되는 비동기방식의 call이 빈번하게 일어날 경우 입니다.
메모리 릭을 피하기 위해 시스템이 call들을 정리해야 한다.
이런 관리는 많은 유지 관리가 필요하며 상태 변화로 인해 객체를 재 생성하는 경우, 이미 만들어진 객체를 다시 호출해야 하므로 리소스가 낭비된다.
액티비티와 프래그먼트는 주로 데이터를 보여주고, 사용자 액션에 반응하고, 권한 요청을 처리한다.
그런데 View가 데이터베이스 또는 네트워크에서 데이터를 로드하는 작업까지 요청되면 너무 헤비한 클래스가 된다.
그래서 ViewModel을 사용하여 View와 ViewModel의 의존성을 줄여보는것이다.
쉽게 말해 ViewModel의 구현을 쉽게 도와주기 위한 AAC ViewModel이라고 보면된다.
Gradle Dependency
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
1. ACC ViewModel을 상속받은 ViewModel클래스 만들기
class MainViewModel : ViewModel() { var count: Int = 0 fun click() { count++ } }
ACC의 ViewModel을 상속해주면 끝이 난다!
뭐 별다른거는 없고 간단하게 카운팅 하는 앱으로 만들어 보기 위해서
카운팅 누적 변수 1개와 클릭시 카운트가 올라가는 함수 1개를 만들어주자.
2. MainActivity (View) 와 ViewModel 연결하기
class MainActivity : AppCompatActivity() { lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) main_view_count.text = viewModel.count.toString() main_button_click.main_button_click.setOnClickListener { viewModel.click() main_view_count.text = viewModel.count.toString() } } }
유심히 살펴봐야 하는거는 ViewModelProviders.of(this).get(MainViewModel::class.java) 이부분이다.
ViewModelProviders를 통해 this (View)의 ViewModel을 MainViewModel::class 와 연결한다는 뜻으로
연결을 해주고 해당 값을 변수로 가지고 있으면 ViewModel의 변수와 함수에 접근 할 수 있게 된다.
그리고 빌드 후 테스트를 해보면 잘 올라가는 것을 볼 수 있다.
또한 화면 회전을 해보면 숫자가 초기화가 되지 않는 것을 볼 수 있다.
간혹가다 ViewModel에서 context가 필요할 수 있는데 그럴때엔 AndroidViewModel 를 상속해주면 된다.
AndroidViewModel는 ViewModel을 상속받은 객체로써 다른점은 context가 있다는거 외에는 똑같다.
'Android > AAC' 카테고리의 다른 글
Android Architecture Components #5 - Room (0) 2019.08.05 Android Architecture Components #4 - Navigation (0) 2019.08.05 Android Architecture Components #3 - LiveData (0) 2019.07.31 Android Architecture Components #1 - DataBinding (0) 2019.07.24 Android Architecture Component가 뭐야? (0) 2019.07.23