관리 메뉴

나만을 위한 블로그

[Android] LiveData observe()가 여러 번 호출되는 에러 해결 본문

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개씩 표시되는 걸 확인했다.

이 현상은 꽤 유명한지 구글에 검색해 보니 스택오버플로우에서 많은 참고자료를 볼 수 있었다.

반응형
Comments