막무가내 삽질 블로그

Cannot invoke setValue on a background thread 본문

Android

Cannot invoke setValue on a background thread

joong~ 2020. 10. 11. 15:18
728x90

mvvm + livedata + rxjava 사용중 나온에러

 

상황

네트워크 연결 실패 시 retryWhen으로 재시도를 처리 할려고 하던 도중 나온 에러

 

Cannot invoke setValue on a background thread 이 에러는 보통 mutablelivedat가 setvalue시 메인스레드에서 해야하는데 백그라운드 스레드에서 했을 경우 나오는 에러 이다.

 

기존 코드는

            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { showLoading() }
            .doAfterTerminate { hideLoading() }
            .retryWhen { retryWhen ->
                retryWhen.flatMap {
                    println("${it.message}")
                    Toast.makeText(sibal, "3초 뒤 새로고침", Toast.LENGTH_SHORT).show()
                    Flowable.timer(3000, TimeUnit.MILLISECONDS)
                }
            }

에러 발생 시 3초 뒤 재시도이다. 하지만 이렇게 하면 위와 같은 에러를 만나게 된다.

 

 

수정 코드 retryWhen의 순서 이동

            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .retryWhen { retryWhen ->
                retryWhen.flatMap {
                    println("${it.message}")
                    Toast.makeText(sibal, "3초 뒤 새로고침", Toast.LENGTH_SHORT).show()
                    Flowable.timer(3000, TimeUnit.MILLISECONDS)
                }
            }
            .doOnSubscribe { showLoading() }
            .doAfterTerminate { hideLoading() }

retryWhen에 subscribe 밑에 있어도 안된다. doafterterminate가 retry 되면 호출되지 말아야하는데 retryWhen보다 먼저 나와있게 되면 호출되게 된다. 이 부분은 rx의 버그인지 아니면 rx가 의도한 설계인지는 모르겠다.

'Android' 카테고리의 다른 글

RxJava 마지막주차  (0) 2020.10.18
RxJava 5주차  (0) 2020.10.11
Migrating from Fabric to Firebase Crashlytics  (0) 2020.10.04
RxJava 4주차  (0) 2020.09.28
Tried the following constructors but they failed to match  (0) 2020.09.27
Comments