2017-12-08 8 views
0

現在、でネットワークに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の代わりに別のクラスを使用する必要があると思いますが、どのクラスがこれに最も適しているかわかりません。

答えて

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 
    } 
} 
関連する問題