[Android] LiveData

곽호택·2021년 8월 9일
1

안드로이드

목록 보기
5/16
post-thumbnail
post-custom-banner

! ViewModel할때 사용하긴 했지만 정확하게 뭐때문에 써야하는지 몰랐기 때문에 다시 공부해서 정리해본다.

1. LiveData란?

LiveData - Android Developer

Live Data는 데이터를 가지고 있는 클래스(Data Holder Class)이고 수명 주기를(Life Cycle)을 인식한다.

즉 Activity, Fragment, Service 등의 앱 컴포넌트의 수명 주기를 고려하는데 이 수명 주기 인식을 통해 active 상태인 앱 컴포넌트 관찰자(Activity, Fragment, Service 등)만 업데이트한다.

여기서 관찰자 클래스(Observer class)로 나타내어지는 관찰자 수명 주기가 STARTED 또는 RESUMED 상태일 경우 LiveData는 관찰자를 active한 상태로 간주한다.

LifeCycleOwner 인터페이스를 구현하는 객체와 페어링된 관찰자를 등록할 수 있습니다.
-> 이것은 무슨말??

- LifeCycleOwner란

안드로이드 생명주기를 알고 있는 클래스이다. Activity 및 Fragment에서 이를 상속하고 있는데 이 말의 의미는 Activity와 Fragment라는 관찰자 클래스가 LifeCycleOwner라는 것이다.

그래서 만약 LifeCycle 객체(Activity 및 Fragment)의 상태가 DESTROYED로 변경될 경우 관찰자를 삭제할 수 있다.

2. LiveData 사용의 이점

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

    LiveData는 Observer 패턴을 따른다. 즉 LiveData는 Observer의 수명 주기 상태에 맞추기 때문에 적합한 UI 데이터를 업데이트 해 줄 수 있다.

  • 메모리 누수 없음

    Observer가 LifeCycle 객체에 결합되어 있어서 앞서 말했듯이 상태가 DESTROYED 상태가 되면 자동으로 삭제 된다.

  • active상태가 아닐 때 비정상 종료 없음

  • 수명 주기를 더 이상 수동으로 처리하지 않음

    LiveData가 관찰하는 동안 Observer의 수명 주기 상태 변경을 인식하기 때문에 자동으로 관리한다.

  • 최신 데이터 유지

    수명 주기가 비활성화 상태였다가 다시 활성화 상태로 바뀔 경우 최신 데이터를 수신한다.

3. LiveData 사용

  • 특정 유형의 데이터를 보유할 LiveData의 인스턴스를 생성한다. 이 작업의 경우 일반적으로 ViewModel 클래스 내에서 이루어진다.
class NameViewModel : ViewModel(){

 private val _currentName = MutableLiveData<String>()

    val currentValue: LiveData<String>
        get() = _currentValue
 }
  • onChanged() 메소드를 정의하는 Observer 객체를 만든다. 이 메서드는 일반적으로 Activity나 Fragment 같은 UI 컨트롤러에 Observer 객체를 만든다.
  • observe() 메소드를 사용하여 LiveData 객체에 Observer 객체를 연결한다. 이때 observe() 메서드는 LifecycleOwner 객체를 사용하는데, 이렇게 하면 Observer 객체가 LiveData 객체를 읽어 변경사항에 관한 알림을 받는다.
class NameActivity : AppCompatActivity(){

	private val model : NameViewModel

	override fun onCreate(savedInstanceState : Bundle?) {
    		super.onCreate(savedInstanceState)
            
            val nameObserver = Observer<String> { newName ->
            
           	nameTextView.text = newName
            }
            
            model.currentName.observe(this, nameObserver)
            
  • LiveData 객체 업데이트
    MutableLiveData 클래스의 경우 setValue()와 PostValue(() 메서드를 통해 LiveData 객체에 저장된 값을 수정할 수 있다.
button.setOnClickListener {
	val anotherName = "John Doe"
    	model.currentName.setValue(anotehrName)
     }

위와 같은 코드에서 setValue()를 호출할 경우 Observer는 anotherName의 값과 함께 onChanged() 메서드를 호출하고 UI가 업데이트된다.

profile
잘하고싶다
post-custom-banner

0개의 댓글