我目前正在尝试使用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
中的所有结果。
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
}
})
我非常喜欢这种设置,因为它允许我将大量逻辑从调用Activity
移动到NetworkConsumer
,并且只担心处理结果。
但是,对于RxLifeCycle
,您需要使用Observable
而不是Single
。所以我创建了一个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
,而我更愿意处理onComplete
中的任何UI更改。
例如,我在网络调用启动时显示加载屏幕,并且我想在完成后隐藏该加载屏幕,无论它是否失败。
我认为我只需要使用另一个类而不是Observer
,但我不确定哪个类最适合这个。
答案 0 :(得分:0)
正确的答案是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
}
}