Livedata는 다른 클래스와 다르게 수명주기를 인식한다고 합니다.
수명주기를 인식한다는 것은 수명주기가 살아있을 때 데이터를 관찰할 수 있다? 이런 말인 듯합니다.
더 나아가서 Observer 클래스로 표현되는 관찰자의 수명 주기가 STARTED 또는 RESUMED 상태이면 LiveData는 관찰자를 활성 상태로 간주한다고 합니다.
그리고 LiveData는 활성 관찰자에게만 업데이트 정보를 알린다고 합니다.
👁🗨 우리가 뉴스 기사를 읽는다고 예를 들어보겠습니다.
우리가 뉴스 기사를 클릭하면 Observer의 수명주기가 STARTED 또는 RESUMED이 됩니다.
이때 기사(글) 및 사진 등에 해당하는 LiveData(Observer 패턴에 등록된)가 Observer에게 알려줘서 우리가 기사를 읽고 사진을 볼 수 있게 해준 다는 것입니다.
1. LiveData는 observer 패턴을 따라서 개발자가 업데이트할 필요가 없습니다.
-> 데이터가 바뀌면 LiveData가 observer에게 알려줘 실시간으로 데이터를 최신화하여 보여줍니다.
2. 메모리 누수가 없습니다.
-> observer가 수명주기에 결합되어 있어서 수명주기가 끝나면 자동으로 같이 삭제되기 때문입니다.
3. 중지된 활동으로 인한 비정상 종료가 없습니다.
-> 수명주기가 비활성 상태(예: activity가 Back Stack에 있을 시)에 있으면 observer는 LiveData의 이벤트를 받지 않습니다.
4. 최신 데이터를 유지합니다.
-> 수명주기가 활성화되면 당연히 LiveData의 알림을 받아 최신 데이터를 유지할 수 있습니다.
Up 버튼과 Down 버튼을 누르면 값이 증가, 감소되는 것을 LiveData를 통해 보이도록 구현했습니다.
private var mutableLiveData = MutableLiveData(0)
val liveData : LiveData<Int>
get() = mutableLiveData
fun up()
{
mutableLiveData.value = mutableLiveData.value!!.plus(1)
}
fun down()
{
mutableLiveData.value = mutableLiveData.value!!.minus(1)
}
mutableLiveData로 변수를 선언하고 초깃값을 0으로 설정하였습니다.
mutableLiveData로 값을 받아 LiveData로 넘기는데 mutableLiveData로 변수를 설정한 이유는 viewModel에서 데이터를 변경 및 저장하는 데 있어서 변경 가능한 일반 클래스이기 때문입니다.
UI 상에서 데이터는 변경되지 않아야 하며 오로지 관찰만 되도록 하기 위해 mutableLiveData 값을 LiveData로 넘겨받습니다.
3.2 MainActivity
upBtn.setOnClickListener {
viewModel.up()
}
downBtn.setOnClickListener {
viewModel.down()
}
viewModel.liveData.observe(this) {
numText.text = it.toString()
}
up 버튼과 down 버튼을 클릭하면 값이 증가 및 감소 되도록 합니다
변경 된 값 LiveData가 observer에게 알려 observer가 변경 된 값을 UI로 보여줍니다.
LiveData가 어떻게 사용되는지와 장점에 대해 알아보았습니다.
다음 글에서는 flow에 대해 알아보겠습니다.