2017-06-21 25 views
0

私はさらに私が終わった方法は以下の通りです、私のAPIが観察返したようネットワーク等をチェックし、表示/非ローダーを表示することができます別の方法で改造API呼び出しをラップしたい:RxJavaで観測可能なものを別の観測可能なものにする方法は?

private <T> Observable<T> request(final Observable<T> apiCall, final ViewManager viewManager) { 
    return Observable.create(new Action1<Emitter<T>>() { 
     @Override 
     public void call(final Emitter<T> emitter) { 
      if (!NetworkUtils.isConnected(context)) { 
       emitter.onError(new ConnectException("network not connected")); 
       return; 
      } 
      viewManager.showLoader(); 
      apiCall.subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Observer<T>() { 
         @Override 
         public void onCompleted() { 
          viewManager.hideLoader(); 
          emitter.onCompleted(); 
         } 

         @Override 
         public void onError(Throwable e) { 
          viewManager.hideLoader(); 
          emitter.onError(e); 
         } 

         @Override 
         public void onNext(T response) { 
          emitter.onNext(response); 
         } 
        }); 
     } 
    }, Emitter.BackpressureMode.BUFFER); 
} 

は、このAです問題に対処する標準的な方法?他の観測対象の中に観測対象をどのようにラップしますか?誰もガイドできますか?

答えて

0

反応拡張を使用する慣用方法は、の組成を使用することです。これはRXの大きな力の1つです。

最初の演算子を使用して所望の動作を定義してみましょう、あなたがしたいことは、このようなものです:今

apiCall 
    .observeOn(AndroidSchedulers.mainThread()) 
    .startWith(Observable.defer(() -> { 
     if (!NetworkUtils.isConnected(context)) { 
      return Observable.error(new ConnectException("network not connected")); 
     } else { 
      return Observable.empty(); 
     } 
    })) 
    .doOnSubscribe(() -> viewManager.showLoader()) 
    .doOnCompleted(() -> viewManager.hideLoader()) 
    .doOnError(throwable -> viewManager.hideLoader()); 

、観察可能な任意のネットワークapiCallにそれを構成するために、あなたはcompose()演算子を使用することができますし、Transformerにこのロジックをカプセル化そのために:

class CustomTransformer<T> implements Observable.Transformer<T, T> { 

    private final ViewManager viewManager; 
    private final Context context; 

    CustomTransformer(ViewManager viewManager, Context context) { 
     this.viewManager = viewManager; 
     this.context = context; 
    } 

    @Override 
    public Observable<T> call(Observable<T> apiCall) { 
     return apiCall 
       .observeOn(AndroidSchedulers.mainThread()) 
       .startWith(Observable.defer(() -> { 
        if (!NetworkUtils.isConnected(context)) { 
         return Observable.error(new ConnectException("network not connected")); 
        } else { 
         return Observable.empty(); 
        } 
       })) 
       .doOnSubscribe(() -> viewManager.showLoader()) 
       .doOnCompleted(() -> viewManager.hideLoader()) 
       .doOnError(throwable -> viewManager.hideLoader()); 
     ; 
    } 
} 

、あなたはどのようなネットワークObservableとそれを構成することができます

someRetrofitQuery 
    .compose(new CustomTransformer<>(viewManager, context)) 
    ... 
    .subscribe(); 
+0

あなたの答えをありがとう。しかし、もし私がcompose()を使わずにプレゼンターにそのオブザーバブルを購読すればどうでしょうか?私はViewManagerのための余分なパラメータが必要になります。私はあなたが構成が必要な理由を理解していませんでした – agile1

+0

私は言ったように、私は言ったように、同じ効果が適用されます(同じ署名を持っている)あなたのメソッドコンテンツを私の提案されたコンテンツで置き換えることもできます、それは方法で鎖を '壊す'ではないので、ここで読むことができますhttp://blog.danlew.net/2015/03/02/dont-break-the-chain/ – yosriz

+0

またはあなたはKotlinを使用することができますObservableの拡張関数としてその関数を作成します。 –

関連する問題