RxAndroid / RxLifeCycle – 处理处理onError而不是onComplete
我正在尝试将RxLifeCycle
实现到与RxJava
联网中。 我一直在使用Consumer
一个子Consumer
,但是对于RxLifeCycle
,你需要处理onError
。 所以我已经转移到Observer
。
这个问题是,当调用被处置时,它调用onComplete
而不是onError
,我更喜欢。
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 : Consumer<NetworkResponse> { @Throws(Exception::class) override fun accept(response: NetworkResponse) { ... } // to override open fun onSuccess(response: T) {} open fun onComplete() {} }
我的网络电话都使用Single
结构化。
fun getFavorites(): Single<NetworkResponse<Array>>
我正在使用它。
service.getFavorites(...) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : NetworkConsumer<Array>() { override fun onSuccess(response: Array) { // use response } override fun onComplete() { // do whatever, like hiding the loading view. loading_view.visibility = View.GONE } })
我真的很喜欢这个设置,因为它允许我将调用Activity
的很多逻辑移动到NetworkConsumer
,只是担心处理结果。
但是,使用RxLifeCycle
,您需要使用Observable
而不是Single
。 所以我创建了一个NetworkObserver
来处理这个变化。
NetworkObserver:
abstract class NetworkObserver : Observer<NetworkResponse> { override fun onSubscribe(d: Disposable) {} override fun onNext(response: NetworkResponse) {} override fun onError(e: Throwable) {} override fun onComplete() {} // other functions from NetworkConsumer }
但是,问题在于在处理网络调用时会调用onComplete
,我宁愿处理onComplete
任何UI更改。
例如,当网络调用开始时,我正在显示一个加载屏幕,并且在完成时要隐藏该加载屏幕,而不管它是否失败。
我相信我只需要使用一个不同的类,而不是Observer
这个,但我不确定哪个类最适合这个。
正确的答案是SingleObserver
,这是完美的网络。
abstract class NetworkObserver : SingleObserver> { override fun onSubscribe(d: Disposable) { ... } override fun onSuccess(response: NetworkResponse ) { ... handle onSuccess } override fun onError(e: Throwable) { ... cancelled or an error } }