Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 서비스 vs 쓰레드
- android retrofit login
- 스택 자바 코드
- android ar 개발
- 클래스
- rxjava disposable
- 멤버변수
- 안드로이드 라이선스 종류
- 서비스 쓰레드 차이
- jvm이란
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 유닛 테스트 예시
- 큐 자바 코드
- ar vr 차이
- ANR이란
- 자바 다형성
- 안드로이드 유닛 테스트
- 안드로이드 레트로핏 crud
- 스택 큐 차이
- 안드로이드 유닛테스트란
- 플러터 설치 2022
- Rxjava Observable
- 안드로이드 라이선스
- 안드로이드 os 구조
- jvm 작동 원리
- 2022 플러터 설치
- rxjava cold observable
- 객체
- rxjava hot observable
- 안드로이드 레트로핏 사용법
Archives
- Today
- Total
나만을 위한 블로그
[Android] LiveData observe()가 여러 번 호출되는 에러 해결 본문
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개씩 표시되는 걸 확인했다.
이 현상은 꽤 유명한지 구글에 검색해 보니 스택오버플로우에서 많은 참고자료를 볼 수 있었다.
반응형
'Android' 카테고리의 다른 글
[Android] 안드로이드 스튜디오 Electric Eel 업데이트 후 앱 실행 시마다 Run 탭 올라오지 않게 하기 (0) | 2023.02.04 |
---|---|
[Android] Coroutine의 Job과 Dispatchers란? (0) | 2023.01.31 |
[Android] 리사이클러뷰 페이징 처리 (페이징 라이브러리 X) (0) | 2023.01.30 |
[Android] 지연 초기화, lateinit vs Lazy (0) | 2023.01.28 |
[Android] 리사이클러뷰가 있는 레이아웃의 성능 향상 - 1 - (0) | 2023.01.26 |
Comments