막무가내 삽질 블로그
Cannot invoke setValue on a background thread 본문
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