2017-12-08 15 views
0

현재 RxJava으로 네트워킹에 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 
    } 
}