본문 바로가기
안드로이드

LiveData와 MutableLiveData 차이점

by 디지털노마더 2021. 5. 19.

▷ LiveData

 : LiveData는 Data 변경을 관찰할 수 있는 Data Holder 클래스입니다.

일반적인 Observable과는 달리, 안드로이드 생명주기(LifeCycle)를 알고 있습니다.

 

Activity, Fragment, Service와 같은 안드로이드 Component LifeCycle를 인식하고

그에 따라 LiveData는 활성상태(Active)일때만 데이터를 Update합니다.

 

* 활성상태 : STARTED / RESUMED 를 의미

 

- LiveData 특징

 ● Observer 패턴에 따라 데이터 변경이 일어날 때마다 Observer 객체에 알려줍니다.

     매번 UI를 업데이트 하는 코드 작성할 필요없이 데이터 상태와 UI를 일치시켜줍니다.

 ● 메모리 누수가 없습니다.

    Observer 객체는 안드로이드 생명주기와 결합되어 있기 때문에 컴포넌트가 Destory 되어도 메모리에서 스스로 해제합니다.

 ● 항상 최신 데이터를 유지합니다.

    화면 구성이 변경(디바이스 회전)되어도 데이터를 유지합니다.

 ● 자원(Resource)을 공유할 수 있습니다.

    LiveData를 상속하여 자신만의 LiveData클래스를 구현할 수 있고 싱글톤 패턴을 이용하여 앱 어디서나 자원을 공유할 수 있습니다.

 

- LiveData 사용법 (예제코드) 

1. ViewModel 클래스 생성

class TestLiveDataViewModel : ViewModel() {
    // String 타입의 MutableLiveData 생성, by lazy로 초기화는 뒤에
    val textValue: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }
}

 

2. MainActivity의 onCreate에 Observer 세팅

class MainActivity : AppCompatActivity() {
    // 전역 변수로 ViewModel lateinit 세팅
    private lateinit var model: TestLiveDataViewModel
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
 
        // ViewModel을 가져옵니다.
        model = ViewModelProvider(this).get(TestLiveDataViewModel::class.java)
 
        // Observer를 생성한 뒤 UI에 업데이트 시켜 줍니다.
        val testObserver = Observer<String> { textValue ->
            // 현재 MainActivity에는 TextView가 하나만 존재합니다.
            // 다른 데이터를 받는 UI 컴포넌트가 있다면 같이 세팅 해줍니다.
            tv_livedata_test.text = textValue
        }
 
        // LiveData를 Observer를 이용해 관찰하고
        // 현재 Activity 및 Observer를 LifecycleOwner로 전달합니다.
        model.textValue.observe(this, testObserver)
    }
}

 

▷ MutableLiveData

  : LiveData를 상속하고 LiveData.setValue(), LiveData.postValue() 구현한 클래스.

 - setValue() : main thread에서 즉시 값 변경하고 옵저버로 데이터 변경 알려줍니다.
 - postValue() :  Runnable로 데이터 변경 요청, Runnable이 실행될때 데이터 변경, background thread에서 값을 설정. Main thread에서 runnable이 실행되기전에 post value가 여러번 호출되도 마지막 변경된 값만 전달합니다.

출처 : Android Developer

 

 ▷ 결론

 : LiveData은 변경될 수 없고, MutableLiveData는 변경될 수 있다는 말이다.

1. val name : LiveData<String> = repository.getName() 
// 를 통해 직접 Room에서 생성한 LiveData를 직접 할당하거나, 

2. val nameMutable = MutableLiveData<String>() 
val name : LiveData<String> = nameMutable 
// 와 같이 mutableLiveData를 직접생성해서 LiveData에 연결 하는 방법을 사용 해야 한다는 것이다.

 

※ 참고내용

https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90

https://yoon-dailylife.tistory.com/m/15?category=956714 

https://comoi.io/300?category=1003732 

댓글