[Android] LiveData
👩지난 시간 알아본 ViewModel과 짝꿍처럼 자주 함께 쓰이는 LiveData에 대해 알아보고자 한다. LiveData에 대해 알아보기 전에 Observer에 대해 간단히 살펴보자!
🙋♀️Observer?
말 그대로 관찰자의 역할을 하는 녀석이다.
데이터가 변경되는지 감시하며, 변경될 경우 UI 컨트롤러에게 알려준다. 알람을 받은 UI 컨트롤러는 해당 데이터로 UI를 업데이트하게 된다.
🙄여기서 Observer가 감시할 수 있는 데이터가 바로 LiveData라는 데이터 홀더 클래스가 가지고 있는 데이터에 해당한다.
🙋♀️LiveData?
공식문서에 나와있는 LiveData에 관한 내용이다.
LiveData는 관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식합니다. 즉, 액티비티, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려합니다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.
그렇다면 LiveData의 사용법을 알아보자!
🙋♀️ViewModel & LiveData
아래 변수 text의 변경을 감시하고자 한다 가정하자.
private val _text = MutableLiveData<String>().apply {
value = "This is home Fragment"
}
-
ViewModel 안에 MutableLiveData객체로 변수 text를 생성한다.
-
<>안에 해당 변수가 어떤 형태인지를 명시해준다.
-
위 방식이 아닌 _text.value를 통해서 값을 넣을 수도 있다.
👩 여기까지 진행한다면 Observer에서 감시할 수 있는 데이터 _text가 만들어진 것이다.
🙄왜 MutableLiveData?
LiveData가 아닌 왜 MutableLiveData 객체로 선언을 해야 할까??
MutableLiveData는 LiveData를 상속받은 클래스로 postValue, setValue 메소드가 추가된 클래스이다. 즉, LiveData가 아닌 Mutabledata 객체로 생성을 해야 값을 수정할 수 있게 된다.
MVVM 패턴을 사용할 경우, 값 변경이 전달되는 과정을 그림을 통해 살펴봐보자.
- 1-2-3 과정을 거쳐 Observer가 값의 변경 사실을 알게된다.
- 즉, Observer는 LiveData를 관찰하게 되고, 이러한 LiveData는 MutableLiveData와 연결되어 있다.
- 2의 과정을 거치는 이유는 UI 컨트롤러에서 값을 직접 수정하지 못하게 하기 위함이다.
🙋♀️LiveData의 장점
- UI와 데이터 상태의 일치 보장
- LiveData가 변경될 때마다 Observer 객체의 알람으로 UI가 업데이트 되기 때문이다.
- 메모리 누수 없음
- Observer는 UI 컨트롤러의 수명 주기를 따르므로 UI 컨트롤러의 수명주기가 끝나면 자동으로 삭제된다.
- 중지된 활동으로 인한 비정상 종료 없음
- 활동이 백스택에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않는다.
- 수명 주기를 더 이상 수동으로 처리하지 않음
- UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않는다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리한다.
- 최신 데이터 유지
- 수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신한다.
- 적절한 구성 변경
- 기기 회전과 같은 구성 변경으로 인해 활동 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 된다.
- 리소스 공유
- LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있다.
🙋♀️LiveData 사용하기
☝️구성요소 추가: gradle
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
✌ LiveData 객체 생성
class HomeViewModel : ViewModel() {
# MutableLiveData 객체 생성
private val _text = MutableLiveData<String>().apply {
value = "This is home Fragment"
}
# LiveData와 MutableLiveData 연결
val text: LiveData<String> = _text
}
- 보통 MutableLiveData의 변수명 앞에는 _를 붙이고 LiveData에는 붙이지 않는다.
👌Observer 객체 생성
class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel
...
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
val textView: TextView = binding.textHome
# ⭐Observer 생성해 LiveData와 연결!
homeViewModel.text.observe(viewLifecycleOwner, Observer {
# 데이터 변경 시마다 실행할 작업
textView.text = it
})
return root
}
...
}
🙄viewLifecycleOwner?
LifeCycleOwner로 Observer가 어떤 액티비티 혹은 프래그먼트의 수명주기를 따를지 정해준다.
- 액티비티의 경우, 위 코드의 viewLifecycleOwner에 this를 작성해주면 된다.
- 즉, Observer가 해당 액티비티에 의해 생성되고, 해당 액티비티의 수명주기를 따르겠다는 말이다.
- 프래그먼트의 경우, viewLifecycleOwner를 사용하면 된다.
📃참고
- [https://developer.android.com/topic/libraries/architecture/adding-components?hl=ko#lifecycle][https://developer.android.com/topic/libraries/architecture/adding-components?hl=ko#lifecycle]
- [https://developer.android.com/topic/libraries/architecture/livedata?hl=ko][https://developer.android.com/topic/libraries/architecture/livedata?hl=ko]
- [https://todaycode.tistory.com/49][https://todaycode.tistory.com/49]
댓글남기기