[Android] LiveData 와 Observer Pattern
LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반클래스와 다르게 LiveData는 생명주기를 인식한다.
LiveData 의 장점
- UI와 데이터 상태 일치
LiveData는 Observer 패턴을 따른다. 기본 데이터가 변경될 때 Observer 객체에게 알린다. 그래서 앱 데이터가 변경될 때 마다 Observer(관찰자) 가 UI를 업데이트한다.
< Observer Pattern 이전글>
2023.03.20 - [Book/헤드퍼스트 디자인패턴] - [Design Pattern] Observer Pattern/옵저버 패턴
[Design Pattern] Observer Pattern/옵저버 패턴
[헤드퍼스트 디자인 패턴] 책을 읽으며 정리한 글입니다 옵저버 패턴 ( Observer Pattern ) 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으
tral-lalala.tistory.com
- 메모리 누수 없음
Observer는 Lifecycle 객체에 결합되어 있어 수명주기가 끝나면 자동으로 삭제된다.
- Activity가 멈췄을 때 crash 없음
Observer의 LifeCycle이 비활성상태이면 LiveData 이벤트도 받지 않음.
- LifeCycle을 수동으로 처리하지 않음
- 항상 최신 데이터를 유지함
LiveData 예시
1. ViewModel에 LiveData 객체 만들기
@HiltViewModel
class UserViewModel @Inject constructor(
private val userRepository: UserRepository,
) : ViewModel() {
private val TAG = javaClass.name
private val _userName = MutableLiveData<String>()
val userName : LiveData<String> = _userName
...
}
2. View에서 LiveData객체 관찰
@AndroidEntryPoint
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels()
private lateinit var binding : FragmentMyBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentMyBinding.inflate(layoutInflater)
initObservers()
return binding.root
}
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
private fun initObservers(){
viewModel.userName.observe(viewLifecycleOwner, Observer{
// Create the observer which updates the UI.
binding.userName.text = it
})
}
override fun onResume() {
super.onResume()
viewModel.getUserData()
}
}
정리
- LiveData는 데이터를 관찰할 수 있도록 해줌. (옵저버 패턴)
- ViewModel에서 LiveData객체를 만들어 데이터를 가지고 있고, View에서 해당 LiveData를 관찰하고 있으면, 데이터의 상태가 바뀌면 구독하고 있던 View에게 연락이 가서 UI가 업데이트 된다.
- LiveData는 생명주기를 인식한다. 즉 Observer의 생명주기 상태를 알고 있다. 그래서 생명 주기 상태에 있는 Observer에게만 업데이트한다.
참고)
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com