[Android] LiveData : setValue() vs postValue()

Jiyoon Chae·2023년 1월 30일
0

안드로이드

목록 보기
14/23

LiveData는 Observer 패턴을 따르며 데이터의 변경이 일어날 때마다 콜백을 받아 원하는 동작을 실행시킨다.
이때 LiveData의 값을 변경하게 해주는 함수가 setValue() 와 postValue() 이다.

LiveData의 setValue() 와 postValue()의 접근 제한자는 protected로 되어있다.
= 외부에서 LiveData 값을 변경할 수 없다.

만약, 외부에서 값을 변경해주기 위해서는 LiveData를 상속받는 MutableLiveData를 사용한다.

setValue()와 postValue()의 차이점

setValue() 는 메인쓰레드에서 LiveData의 값을 변경해준다!!
메인쓰레드에서 바로 값을 변경해주기 때문에 setValue() 함수를 호출한 뒤 바로 밑에서 getValue() 함수로 값을 읽으면 변경된 값을 얻을 수 있다.
하지만, setValue()는 메인스레드에서 값을 dispatch하기 때문에 백그라운드에서 setValue()를 호출한다면 오류가 난다.
해당 함수가 호출되는 스레드가 메인스레드인지 아닌지 체크가 중요!!

postValue() 는 백그라운드에서 값을 세팅한다!! 백그라운드 스레드에서 동작하다가 메인스레드에 값을 post하는 방식이다!
메인스레드에 적용되기 전에 postValue()를 여러번 호출한다면, 가장 마지막 값만 적용된다.
따라서 postValue()를 호출한 뒤 바로 getValue()로 값을 읽으려고 한다면 변경된 값을 읽어오지 못할 가능성이 높다. Hander()를 통해 메인 쓰레드에 값이 전달되기 전에 getValue()를 호출하기 때문이다.

LiveData의 값을 즉각적으로 변경해야 한다면 postValue()가 아닌 setValue()를 사용해야 한다.

 fun getMenuInitData() {
        HanaRepository.Menu.getMenuInitData() {
            if (it != null) {
                menuInitData.postValue(it)
            }
        }
    }```
profile
바닐라라떼 좋아☕

0개의 댓글