RxAndroid / RxLifeCycle - 处理处置 onError 而不是 onComplete
RxAndroid / RxLifeCycle - Handling dispose onError instead of onComplete
我目前正在尝试将 RxLifeCycle
实施到我的 RxJava
网络中。我一直在使用 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
中的所有结果。
网络消费者:
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
}
})
我真的很喜欢这种设置,因为它允许我将很多逻辑从调用 Activity
移到 NetworkConsumer
中,而只担心处理结果。
但是,对于 RxLifeCycle
,您需要使用 Observable
而不是 Single
。所以我创建了一个 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
,我更愿意处理 onComplete
中的任何 UI 更改。
例如,我在网络呼叫开始时显示一个加载屏幕,我想在完成时隐藏该加载屏幕,无论它是否失败。
我相信我只需要为此使用不同的 Class 而不是 Observer
,但我不确定哪个 Class 最适合这个。
正确答案是 SingleObserver
,这非常适合网络。
abstract class NetworkObserver<T> : SingleObserver<NetworkResponse<T>> {
override fun onSubscribe(d: Disposable) {
...
}
override fun onSuccess(response: NetworkResponse<T>) {
... handle onSuccess
}
override fun onError(e: Throwable) {
... cancelled or an error
}
}
我目前正在尝试将 RxLifeCycle
实施到我的 RxJava
网络中。我一直在使用 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
中的所有结果。
网络消费者:
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
}
})
我真的很喜欢这种设置,因为它允许我将很多逻辑从调用 Activity
移到 NetworkConsumer
中,而只担心处理结果。
但是,对于 RxLifeCycle
,您需要使用 Observable
而不是 Single
。所以我创建了一个 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
,我更愿意处理 onComplete
中的任何 UI 更改。
例如,我在网络呼叫开始时显示一个加载屏幕,我想在完成时隐藏该加载屏幕,无论它是否失败。
我相信我只需要为此使用不同的 Class 而不是 Observer
,但我不确定哪个 Class 最适合这个。
正确答案是 SingleObserver
,这非常适合网络。
abstract class NetworkObserver<T> : SingleObserver<NetworkResponse<T>> {
override fun onSubscribe(d: Disposable) {
...
}
override fun onSuccess(response: NetworkResponse<T>) {
... handle onSuccess
}
override fun onError(e: Throwable) {
... cancelled or an error
}
}