Android LiveData
업데이트:
카테고리: Android
/태그: DataBinding, LiveData, Observer, ViewModel, 캡슐화
구성 변경이 일어날 때 데이터는 저장되지 않는다.
Activity가 재생성되기에 LifeCycle도 onDestory → onCreate 가 호출된다.
앱 아키텍쳐
-
UI Controlloer
Activity, Fragment와 같은 UI 기반의 클래스
시스템 상호작용과 같은 로직만 있어야한다.
ex) 유저가 화면을 누를때 알림, 요소 그리기…
-
ViewModel
Activity, Fragment에 연관된 데이터
UI 클래스와 동일한 생명주기를 가지고 있다. 단, 구성변경과 같은 reCreate가 발생할 때에는 viewModel에 저장되어 있는 데이터가 유지된다.
간단한 계산이나 변환은 괜찮다.
-
ViewModelFactory
viewModel에 의존성이 필요할 때 Factory를 사용하여 의존성을 처리한다.
-
ViewModelProvider
없으면 ViewModel 객체를 생성하고 있으면 생성된 ViewModel 객체를 반환한다.
-
LiveData
수명주기를 인식하는 관찰가능한 데이터 홀더 클래스 → 따로 변경에 따른 로직을 작성할 필요가 없다
- 관찰가능함: LiveData에서 변화가 생겼을 떄 observer를 통해 알림을 보낼 수 있다.
- 수명주기 인식: LifeCyclerOwner와 관찰자가 연관되어 있고 수명주기가
STARTED
,RESUMED
일 때만 데이터가 변경된다.
관찰자 연결
observer
를 세팅할 때 LifeCyclerOwner를 설정한다.
그 이유는 Fragment나 Activity로 이동하는 과정에서 관찰자가 소실되면 업데이트 하는 과정에서 오류가 발생할 수 있기에 각 observer마다 관찰자를 세팅해야된다.
viewModel.varible.observer(viewLifeCycleOwner, Observer { newVar ->
binding.old.text = newVar
})
viewModel에 정의된 변수에 변화가 생기면 observer 내부에 있는 로직이 실행된다.
캡슐화
다루는 데이터가 많으면 UI Controller에서 변경이 발생할 수 있다.
그래서 viewModel 내부에서만 변경이 일어나도록 하고, UI Controller에서 사용하는 값은 읽기 전용인 변수 타입으로 건네줘야한다.
MutableLiveData
: 수정이 가능, ViewModel 내에 있다.LiveData
: 수정이 불가, ViewModel 외부에 존재하며, LiveData의 형태로 사용된다.
Backing Property
프로퍼티 = 필드 + 게터 + 세터
val - Getter / var - Getter, Setter
// 명시적으로 getter, setter를 설정할 수 있다.
val name = "KIM"
get() {
return field
}
이것을 ViewModel 내부에 적용해보면
private val _score = MutableLiveData(0)
val score: LiveData<Int> = _score
변경 가능한 MutableLiveData는 private
로 ViewModel 내부에서만 접근이 가능하고 외부에서는 읽기 전용 값인 LiveData
만 접근할 수 있다.
DataBinding
xml 파일과 ViewModel의 데이터가 직접 소통
타입 보호 + 뷰 객체에 데이터를 직접적으로 보여줄 수 있다.
build:gradle(Moudle:app)
에 buildFeature { dataBinding true } 설정-
dataBinding을 사용할 xml 파일에 data 연결
<layout> <data> // 사용할 ViewModel과 xml에서 사용할 변수명을 적는다. <varible name="" data=""> </data> </layout>
- xml 에
@{example.onClick}
와 같은 형식으로 데이터를 연결한다. - Activity, Fragment에서
binding.lifecycleOwner = ViewlifecycleOwner
로 설정