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