-
[Android] LiveData 와 Observer PatternAOS 2023. 3. 20. 21:53반응형
LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반클래스와 다르게 LiveData는 생명주기를 인식한다.
LiveData 의 장점
- UI와 데이터 상태 일치
LiveData는 Observer 패턴을 따른다. 기본 데이터가 변경될 때 Observer 객체에게 알린다. 그래서 앱 데이터가 변경될 때 마다 Observer(관찰자) 가 UI를 업데이트한다.
< Observer Pattern 이전글>
2023.03.20 - [Book/헤드퍼스트 디자인패턴] - [Design Pattern] Observer Pattern/옵저버 패턴
- 메모리 누수 없음
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
반응형'AOS' 카테고리의 다른 글
[Andorid] local.properties를 이용하여 API URL, KEY 안전하게 숨기기 (0) 2023.06.13 [Android] 무한스크롤 Infinite Scroll (0) 2023.05.17 [Android] 이미지 라이브러리(glide)없이 URL로 이미지 나타내기 (0) 2023.05.12 [Android] 안드로이드 모듈화 Modularization 적용하기 (0) 2023.03.04 [Kotlin] MpAndroidChart 사용하기 / 클릭하면 x축 label 출력 (0) 2022.01.05