Livedata 를 적극 사용하자 (feat ViewModel - MVVM과 다르다!)
아직 모르는것이 많기 때문에 추후에 또 변경될 수 도 있다. 쓰지 말자 라고..
지금껏 파악하기로는, 적극적으로 사용하는것을 권장한다.
일단 ViewModel 부터 정리하자면, 일반적으로 디자인패턴에서 말하는 ViewModel 과는 다르다.
물론 MVVM 패턴의 ViewModel을 내포할 수 있지만, 근본적으로는 다른 의미 이다.
Livadata의 경우 C#의 Observable과 동일한 것으로 보이는데, 활용도가 완전히 다르다.
아무래도 안드로이드 특성이 윈도우와 다르다보니... C#에서는 한정적으로 사용하나, 안드로이드에선
여기저기 다 써도 무방해 보인다.
(정확히 말하자면 C# 에서는 변수값이 변경되었을때 처리해야 할 일이 별로 없다. UI 정도..)
1. 안드로이드 에서의 ViewModel
- 안드로이드 라이프사이클과 연관되어 있다.
- Activity 나 Fragment는 화면 회전 등이 이루어 질때 distroy 되었다가 다시 생성된다.
그러나 ViewModel은 그렇지 않다. 라이프사이클이 길다. (finish 혹은 detatch 될때까지 살아있다)
- 화면 회전등으로 인해 Activity, Fragment 가 재 실행될때 문제가 아주 많다. 보다 긴 ViewModel을
사용할 경우 데이터의 변화나 저장, 유지가 수월하기에 ViewModel 쓰는것을 적극 권장하며,
이는 MVVM의 뷰모델과는 다른 의미이다
- 물론 ViewModel 안에서 MVVM에서 말하는 ViewModel 형식으로 구현하면 둘 다 만족하게 된다.
* C# 에서 MVVM 구현시에는 View 에는 아무 코드도 구현하지 않는다. 하지만 안드로이드에선
UI에 관련된 코드는 View 에 구현하고(Livedata observe), ViewModel 에서 Livedata에 값을 배정하는 방식으로
구현한다.
2. Livedata
- observe 함수를 통해 변수값에 변화가 생겼을때 동작 처리를 할 수 있다.
예 : ) xxx.observe (lifecyclerowner 변수){ textView.text = it } 으로 처리하고,
xxx.value = "test" 으로 값의 변화를 줄 수 있다.
- ViewModel을 위해 만들어 졌다 한다. 메모리 leak 방지.
-> ViewModel의 라이프사이클이 훨씬 길기 때문에 Activity나 Fragment가 재시작되고 난리를 피워도 문제없다.
- Activity, Fragment가 살아 있을 때에만 observe가 호출되며, 재실행시에도 자동으로 호출 된다.
-> 이게 가장 큰 이유인데, 화면 회전등으로 인해 재시작 될 때에도 기존 데이터를 자동으로 유지할 수 있다는 뜻.
안드로이드의 빌런중 하나를 꼽자면, Activity나 Fragment의 재시작을 꼽을 수 있다. 이때 어플이 잘 죽기도 하고 오동작도 잘 한다. UI가 이상해 지기도 하고. 이를 그나마 최대한 막을 수 있는것이 LiveData를 활용하는것으로 보인다.
즉, observe 안에 UI를 변경토록 코드를 짜 놓는 식으로 구현하는게 좋아 보인다.