[Android 앱 개발 숙련] 챌린지 - LiveData

0
post-thumbnail
post-custom-banner

[Android 앱 개발 숙련] 챌린지 - LiveData

LiveData?

  • LiveData?
    • 관찰 가능한 데이터 홀더 클래스
    • Activity, Fragment, Service 등 다른 앱 구성요소의 수명주기 고려
  • LiveData에 LifecycleOwner 인터페이스를 구현하는 객체(ex. Activity, Fragment)와 페어링된 관찰자 등록 가능
    • 페어링 된 객체의 수명 주기가 STARTED 또는 RESUMED일 때:
      관찰자는 LiveData 변경사항에 관한 알림을 받음
    • 페어링된 객체의 수명 주기가 DESTROYED로 변경될 때:
      관찰자 삭제

LiveData 사용의 이점

  • UI와 데이터 상태의 일치 보장
    • LiveData 데이터 변경 -> 관찰자 알림 받음 -> 관찰자가 UI 업데이트
    • 개발자가 데이터가 변경될 때마다 UI를 업데이트할 필요 X
  • 메모리 누수 X
    • 관찰자와 페어링된 객체의 수명 주기가 끝나면, 관찰자 바로 삭제
  • 중지된 활동으로 인한 비정상 종료 X
    • 관찰자와 페어링된 객체의 수명주기가 active하지 않으면, 이벤트를 받지 X
  • 수명 주기를 수동으로 처리 X
  • 최신 데이터 유지
  • 리소스 공유
    • 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스 래핑 가능
      -> 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있음

LiveData 객체 사용

  • (1) 데이터를 보유할 LiveData 인스턴스 생성
    • 일반적으로 ViewModel 클래스 내부에 생성
  • (2) onChanged() 메서드를 정의하는 Observer 객체 생성
    • LiveData가 보유하는 데이터가 변경되었을 때 수행할 작업 제어
    • 일반적으로 UI 컨트롤러 내부에 생성
      (UI 컨트롤러 ex. Activity, Fragment)
  • (3) observe() 메서드를 사용하여 LiveData 객체에 Observer 객체 연결
    • 객체 관찰 시작에 적합한 장소: UI 컨트롤러의 onCreate()
      @MainThread
      observe(@NonNull LifecycleOwner owner, @NonNull Observer<Object> observer)
  • (4) LiveData 객체 업데이트
    • MutableLiveData 클래스의 setValue(T) 및 postValue(T) 메서드 사용
      -> Observer 이벤트 트리거
      -> onChanged() 메서드 호출
  • observeForever(Observer) 메서드:
    페어링된 LifecycleOwner 객체가 없는 관찰자 등록
    -> 관찰자 항상 active 상태로 간주
    -> 항상 변경사항 이벤트를 받음
  • removeObserver(Observer) 메서드:
    위와 같은 관찰자 삭제

📌참고자료: LiveData setValue(), postValue() 차이

  • setValue(T)
    • MainThread에서 LiveData의 값 변경
    • LiveData의 값을 즉각적으로 변경해야할 때 사용
    • 백그라운드에서 setValue()를 호출하면 오류 발생
  • postValue(T)
    • 백그라운드에서 LiveData의 값 변경
    • postValue()를 호출한 뒤 바로 getValue()로 값을 읽을 경우,
      변경된 값을 읽어오지 못 할 가능성이 있다
    new Handler(Looper.mainLooper()).post(() -> setValue())
profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글