밍쯔와 안작고 안귀여운 에러들🖤

[Android] UndeliverableException / Rxjava 본문

Develop/Android | iOS

[Android] UndeliverableException / Rxjava

밍쯔 2023. 5. 4. 14:25

왜,,, 갑자기 왜,,,, 이런 에러가 뜬금없이 떴는지 모르겠다!!

당황했지만 언제나 그렇듯 바아로 구글링

 

* 오류가 발생하는 가능성은?

위 오류를 해석해보면 진행 중 발생한 오류를 보내야 할 대상이 사라졌다는 것이다.

consumer가 canceled/disposed 되어 보낼 곳이 없다는 것이다.

실제 런타임에서 발생한 사례는 아래와 같이 추측할 수 있다.

  • 상황 1 Timeout이 발생할 정도로 서버의 응답이 늦었다.
  • 상황 2 데이터의 전달 오류로 UnknownError가 발생하였다.

위와 같은 상황 1에서 사용자는 아래와 같이 행동할 수 있다.

  • 사용자는 대기가 길어 이미 back 키를 마구 눌러 화면을 떠나버렸다.
  • 라이프 사이클 상 onDestroy 동작하였고, RxJava의 disposable을 동작하는 코드가 동작하였다.

 

나의 경우 상황2에 해당했고, 아래 코드를 추가해주고 문제 해결!

 

RxJavaPlugins.setErrorHandler { e ->
    var error = e
    if (error is UndeliverableException) {
        error = e.cause
    }
    if (error is IOException || error is SocketException) {
        // fine, irrelevant network problem or API that throws on cancellation
        return@setErrorHandler
    }
    if (error is InterruptedException) {
        // fine, some blocking code was interrupted by a dispose call
        return@setErrorHandler
    }
    if (error is NullPointerException || error is IllegalArgumentException) {
        // that's likely a bug in the application
        Thread.currentThread().uncaughtExceptionHandler
                .uncaughtException(Thread.currentThread(), error)
        return@setErrorHandler
    }
    if (error is IllegalStateException) {
        // that's a bug in RxJava or in a custom operator
        Thread.currentThread().uncaughtExceptionHandler
                .uncaughtException(Thread.currentThread(), error)
        return@setErrorHandler
    }
    Log.w("Undeliverable exception received, not sure what to do", error)
}