Android
[Android] LiveData observe()가 여러 번 호출되는 에러 해결
참깨빵위에참깨빵_
2023. 1. 31. 01:04
728x90
반응형
API 결과값을 LiveData로 받은 다음 액티비티 / 프래그먼트에서 이를 관찰하는 처리를 수행하는 로직을 짤 때가 있다.
예를 들어 로그인이라면 로그인 API를 호출해서 결과값을 받고, boolean 값에 따라 화면을 이동할지 에러를 토스트로 띄울지를 결정한다고 가정한다.
아래와 같이 사용하면 로그인 버튼을 연타했을 때 로그인 성공 로그가 처음에는 한 번만 출력되던 것이 연타할수록 점점 그 개수가 늘어나 로그캣 창이 꽉 차 버리는 걸 볼 수 있었다.
private fun login(requestDTO: RequestDTO) {
binding.isLoading = true
viewModel.login(requestDTO)
observeResult()
}
이렇게 하는 대신, 어차피 뷰모델의 LiveData는 뷰가 관찰하고 있기 때문에 뷰에서 LiveData를 관찰하는 함수인 observeResult()는 굳이 저 안에 둘 필요가 없다.
위 코드에서 observeResult(viewModel)을 onCreate() 안으로 빼주면 모든 게 해결된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind {
btnLogin.setOnClickListener {
// 대충 로그인에 필요한 로직들
login(requestDTO)
}
}
observeResult()
}
private fun login(requestDto: RequestDTO) {
binding.isLoading = true
viewModel.login(requestDto)
}
private fun observeResult() {
viewModel.resultData.observe(this@MainActivity) { result ->
val isLoginSuccess: Boolean = result.success
if (isLoginSuccess) {
// 성공 시
} else {
// 실패 시
}
binding.isLoading = false
}
}
이렇게 하니 버튼을 연타할 때마다 결과 로그가 2개, 3개씩 늘어나는 게 아닌 1개씩 표시되는 걸 확인했다.
이 현상은 꽤 유명한지 구글에 검색해 보니 스택오버플로우에서 많은 참고자료를 볼 수 있었다.
반응형