하루에 0.01%라도 성장하자

Develop/Android

Livedata setValue와 postValue 그리고 Cannot invoke setValue on a background thread

뚠님 2022. 11. 10. 11:16
반응형

안드로이드를 개발할 때 요즘 많이들 livedata를 사용한다.

 

state관리에도 용이하고 UI를 즉각 반영할 때도 좋다

livedata를 다루는 여러 가지 기술도 있지만 오늘은 setValue postValue 에 대한 기록을 남기려고 한다.

 

내가 겪은 코드는 아래와 같다

Cannot invoke setValue on a background thread

백그라운드 쓰레드에서 setVlaue를 호출 할 수 없습니다 :(

 

setValue

setValue는 MainThread에서 동작하는 방식이다.

// viewModel

private val _textStr: MutableLiveData<String> = MutableLiveData()
val textStr: LiveData<String>
    get() = _textStr


... 
 _textStr.value = "네트워크 통신을 통해 받은 값"



//layout.xml



android:text="@{viewModel.textStr}"

내가 요청한 setValue는 네트워크 통신을 마치고 그 결과값을 value에 넣는 방식이었다.

그렇기 때문에 백그라운드 쓰레드 내에서 동작하게 되었고 위와같은 에러를 발생시켰다.

 

postValue

// viewModel

private val _textStr: MutableLiveData<String> = MutableLiveData()
val textStr: LiveData<String>
    get() = _textStr


... 
 _textStr.postValue("네트워크 통신을 통해 받은 값")



//layout.xml



android:text="@{viewModel.textStr}"

 

postValue는 백그라운드 쓰레드에서 동작하는 값 변경 메소드다

따라서 백그라운드 쓰레드에서 동작 시키려면 위와 같이 postValue를 사용하면 된다 :)

반응형