현재 RxJava
으로 네트워킹에 RxLifeCycle
을 구현하려고합니다. Consumer
의 하위 클래스를 사용했지만 RxLifeCycle
의 경우 onError
을 처리해야합니다. 그래서 Observer
으로 옮겼습니다.RxAndroid/RxLifeCycle - onComplete 대신 onError 처리하기
이 문제는 통화가 처리 될 때 onError
대신 onComplete
이 호출된다는 것을 의미합니다.
buildle.gradle :
// RxJava
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.3'
compile 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1'
내 NetworkConsumer
이전과 같이 구성되었다, 나는 accept
의 모든 결과를 처리 할 것입니다.
NetworkConsumer는 :
abstract class NetworkConsumer<T> : Consumer<NetworkResponse<T>> {
@Throws(Exception::class)
override fun accept(response: NetworkResponse<T>) {
...
}
// to override
open fun onSuccess(response: T) {}
open fun onComplete() {}
}
내 네트워크 호출 모든 Single
를 사용하여 동일한 방식으로 구성되어 있습니다.
fun getFavorites(): Single<NetworkResponse<Array<MyObject>>>
그리고 저는 이것을 이렇게 사용하고 있습니다.
service.getFavorites(...)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : NetworkConsumer<Array<MyObject>>() {
override fun onSuccess(response: Array<MyObject>) {
// use response
}
override fun onComplete() {
// do whatever, like hiding the loading view.
loading_view.visibility = View.GONE
}
})
내가 정말 나를 NetworkConsumer
로 호출 Activity
에서 논리를 많이 이동하고 결과만을 처리에 대해 걱정할 수 있습니다으로이 설정있다.
그러나 RxLifeCycle
을 사용하는 경우 Single
대신 Observable
을 사용해야합니다. 그래서이 변경을 처리하기 위해 NetworkObserver
을 만들었습니다.
NetworkObserver는 :
abstract class NetworkObserver<T> : Observer<NetworkResponse<T>> {
override fun onSubscribe(d: Disposable) {}
override fun onNext(response: NetworkResponse<T>) {}
override fun onError(e: Throwable) {}
override fun onComplete() {}
// other functions from NetworkConsumer
}
그러나 문제는 네트워크 호출이 내가 대신 onComplete
의 모든 UI 변경을 처리하는 것을 선호하는, 배치 될 때 onComplete
가 호출되고 있다는 점이다.
예를 들어, 네트워크 호출이 시작될 때 로딩 화면을 표시하고 실패했는지 여부에 관계없이 완료되면 로딩 화면을 숨기려고합니다.
나는 이걸 대신 Observer
대신 다른 클래스를 사용해야한다고 믿지만, 어떤 클래스가 가장 잘 작동하는지 확신 할 수 없다.