[androidx] LiveData

sundays·2022년 12월 14일
0

android

목록 보기
6/18
post-thumbnail

LiveData

LiveData는 관찰 가능한 데이터 홀더 클래스 입니다. 활동 수명주기 상태에 있는 앱 구성요소 관찰자만 업데이트 하게 됩니다. STARTED, RESUMED 상태 일때 활성 상태이며 이때 업데이트 정보를 알립니다. DESTROYED 로 상태가 변경되면 관찰자를 삭제하여 객체를 관찰할 수 있고 메모리 누수를 방지할 수 있습니다.

LiveData 장점

UI 와 데이터 상태의 일치 보장

  • 데이터가 변경될때 Observer 객체에 UI를 업데이트 할 수 있습니다
  • 관찰자가 대신 UI를 업데이트 하기 때문에 개발자가 업데이트 할 필요가 없습니다

메모리 누수 없음

  • LifeCycle 객체에 결합되어 연결된 수명 주기가 끝나면 자동으로 삭제 됩니다.

비정상 종료 방지

  • 관찰자의 수명주기가 비활성 상태인경우에는 LiveData 이벤트를 받지 않습니다.

수명주기를 자동으로 처리

  • 데이터를 관찰하기만 하기 때문에 관찰을 중지하거나 다시 시작하지 않음
  • LiveData가 관찰하는 동안 수명 주기 상태의 변경을 인식하여 수명주기를 자동으로 관리

최신 데이터 유지

  • 수명 주기가 비활성화 되면 다시 활성화시 최신데이터를 수신합니다
  • 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신데이터를 받습니다

적절한 구성 변경

  • 리컴포지션 또는 프래그먼트가 다시 생성되면 사용가능한 최신데이터를 즉시 받게 됩니다

리소스 공유

  • 앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용한 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다
  • 시스템 서비스에 한번 연결될 경우 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.

LiveData 사용

  • 일반적으로 ViewModel 클래스 내에서 LiveData의 인스턴스를 생성합니다
  • onChnaged() 메서드를 정의하는 Observer 객체 생성
  • observe() 메서드롤 LiveData 객체에 Observer 객체를 연결
    • lifecycleOwner 객체를 사용하기 때문에 변경사항에 대한 알림을 받을 수 있음
    • 일반적으로 Activity나 Fragment같은 UI Controller에 Observer를 연결함

LiveData 객체 생성

  • Collections 같은 모든 데이터와 함께 사용할 수 있는 Wrapper
  • VieModel에서 객체에서 저장되어 getter 메서드를 통해 액세스
class NameViewModel : ViewModel() {

    // Create a LiveData with a String
    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    // Rest of the ViewModel...
}
  • UI 컨트롤러가 데이터 표시를 담당하지만 데이터 상태를 보유 하지 않습니다
  • 리컴포지션에도 LiveData 객체가 유지되도록 하기 위해서 사용합니다.

LiveData Observe

  • onCreate() 에서 LiveData 객체 관찰을 해야하는 이유
    • onResume() 에서 중복호출 방지를 위해
    • 활성상태가 되는 즉시 표시할 수 있는 데이터가 포함되도록 하기위해
  • 데이터가 변경될때 Active Observer 에게만 업데이트를 전달
    • 비활성에서 활성 으로 변경될 때 관찰자가 업데이트를 전달받음
    • 비활성에서 활성 상태로 두번째 변경되면 마지막으로 활성 상태가 된 이후 값이 변경된 경우에만 업데이트를 받음

객체 관찰 예

class NameActivity : AppCompatActivity() {

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Other code to setup the activity...

        // Create the observer which updates the UI.
        val nameObserver = Observer<String> { newName ->
            // Update the UI, in this case, a TextView.
            nameTextView.text = newName
        }

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)
    }
}
  • nameObserver 를 매개변수로 전달
  • observe()를 호출 하면 onChange()가 즉시 호출
  • mCurrentName에 저장된 최신값을 제공
  • LiveData가 객체가 mCurrenName에 값을 설정하지 않았다면 onChange()는 호출되지 않는다

LiveData update

  • LiveData는 데이터를 업데이트 하는데 공개적으로 사용할 수 있는 메서드는 없음
  • MutableLiveData는 setValue, postValue 메서드를 사용하여 지정된 값을 수정할 수 있습니다.
button.setOnClickListener {
    val anotherName = "John Doe"
    model.currentName.setValue(anotherName)
}
  • 버튼이 눌리면 onChanged() 메서드 호출됨
  • setValue() 또는 postValue() 를 네트워크 요청 데이터베이스 로드 완료될때 호출하여 사용할 수 있습니다. 이렇게 하면 관찰자가 트리거 되어 UI가 업데이트 됩니다.

Reference

profile
develop life

0개의 댓글