RxAndroid / RxLifeCycle - 处理处理onError而不是onComplete

时间:2017-12-08 05:31:50

标签: android rx-java android-lifecycle rx-android

我目前正在尝试使用RxLifeCycleRxJava实施到我的网络中。我一直在使用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,但我不确定哪个类最适合这个。

1 个答案:

答案 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
    }
}