2017-03-16 7 views
0

Rxjavaを初めて使用しています。それは非常に複雑です......Rxjava2 - マルチレトロフィット要求とすべての例外処理

私は複雑なシナリオを扱う必要があります、私はRxjavaを使ってそれを作る方法を知りたいです。

それはアプリの開始に関するロジックです:

  • オープン

    1. アプリの開始とsplashページは、アプリがアップデートする必要があれば、HTTP reqesut check_updateチェックすることにします。
    2. 新しいバージョンがあり、更新が必要な場合は、updateボタンを1つだけ使用して通知ダイアログをポップアップします。もしアプリケーションが新しいバージョンを持っていて、更新する必要がなければ、2つのボタン(updateignore)でダイアログをポップアップします。新しいバージョンがない場合は、次に進みます。
    3. 更新する必要はありませんので、現在はauth_tokenの状態に従ってhomeページまたはloginページにジャンプする必要があります。
    4. auth_tokenからsharedPreferenceを読み取ります。 http要求check_authを呼び出して、有効かどうかを確認します。有効な場合は、homeページにジャンプしてください。そうでない場合は、loginページにジャンプしてください。

    このプロセスでは、2つのHTTPリクエストと多数の条件チェックが行われます。 httpリクエストエラーも処理する必要があります。このプロセスを1つで記述できますかRxjava

    私はこのようにすることができると思いますが、それが正しいかどうかはわかりません。

    mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request 
          .compose(RxUtil.applyScheduler()) // scheduler 
          .flatMap(RxUtil.applyFunction()) // handle the response. 
          .flatMap((Function<CheckUpdateResponse, ObservableSource<?>>) checkUpdateResponse -> { 
           int updateMode; 
           if (checkUpdateResponse.isHas_new_version()) { 
            if (checkUpdateResponse.isForce_update()) { 
             updateMode = FORCE_UPDATE; // 1 
            } else { 
             updateMode = CHOOSE_UPDATE; // 2 
            } 
           } else { 
            updateMode = NO_UPDATE; // 0 
           } 
           return Observable.just(updateMode); 
          }) 
          .flatMap(o -> { 
           if (Integer.parseInt(o.toString()) == NO_UPDATE) { 
            return mRetrofitService.checkAuth(); 
           } 
           return null; //what should I return for pop up dialog? 
          }) 
          .flatMap(RxUtil.applyFunction()) 
          .subscribe(new Observer<CheckAuthResponse>() { 
           @Override 
           public void onSubscribe(Disposable d) { 
    
           } 
    
           @Override 
           public void onNext(CheckAuthResponse checkAuthResponse) { 
            // valid 
            gotoHome(); 
           } 
    
           @Override 
           public void onError(Throwable e) { 
            // should I handle pop here? 
            // should I handle auth invalid here? 
            // should I handle checkUpdate request error here? 
            // should I handle checkAuth here? 
            // how to distinguish these errors? 
           } 
    
           @Override 
           public void onComplete() { 
    
           } 
          }); 
    

    私はそうですか?そして私の質問に答えてください(コードのコメント)?

  • 答えて

    0

    文書「onError」によれば、オブザーバブルにエラー状態が発生したことをオブザーバに通知します。したがって、このコールバックは要求エラーを処理するためには関係ありません。

    Responseレトロフィットのクラスを使用して、異なるケースを処理することをお勧めします。

    @method(url) 
    Call<CheckAuthResponse> checkUpdate(...); 
    

    し、あなたのRXワークフローで:あなたがそのようなあなたのサービスを定義する例えば

    mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request 
          .compose(RxUtil.applyScheduler()) // scheduler 
          .flatMap(RxUtil.applyFunction()) // handle the response. 
          .map((Function<Response<CheckUpdateResponse>, CheckUpdateResponse>) retrofitResponse -> { 
           if (retrofitResponce.code() == authInvalidCode) { 
            //do something 
           } else if (...) { 
    
           } 
           return retrofitResponse.body() 
          }) 
          .flatMap((Function<CheckUpdateResponse, ObservableSource<?>>) checkUpdateResponse -> { 
           int updateMode; 
           if (checkUpdateResponse.isHas_new_version()) { 
            if (checkUpdateResponse.isForce_update()) { 
             updateMode = FORCE_UPDATE; // 1 
            } else { 
             updateMode = CHOOSE_UPDATE; // 2 
            } 
           } else { 
            updateMode = NO_UPDATE; // 0 
           } 
           return Observable.just(updateMode); 
          }) 
          .flatMap(o -> { 
           if (Integer.parseInt(o.toString()) == NO_UPDATE) { 
            return mRetrofitService.checkAuth(); 
           } 
           return null; //what should I return for pop up dialog? 
          }) 
          .flatMap(RxUtil.applyFunction()) 
          .subscribe(new Observer<CheckAuthResponse>() { 
           @Override 
           public void onSubscribe(Disposable d) { 
    
           } 
    
           @Override 
           public void onNext(CheckAuthResponse checkAuthResponse) { 
            // valid 
            gotoHome(); 
           } 
    
           @Override 
           public void onError(Throwable e) { 
            // should I handle pop here? 
            // should I handle auth invalid here? 
            // should I handle checkUpdate request error here? 
            // should I handle checkAuth here? 
            // how to distinguish these errors? 
           } 
    
           @Override 
           public void onComplete() { 
    
           } 
          }); 
    

    ・ホープ、このことができます。

    私の英語のために残念です。

    +0

    '場合(retrofitResponce.code()== authInvalidCode){ //何かを }' 私はトーストを表示する場合、私がここでそれを作ることができないようですので、それは、schedule.ioで実行されます。 – Leon

    +0

    マップ関数observeOn(Androidscheduler.mainThread())の前に、別のスレッドで次の操作をしたい場合は、observeOn(relevantScheduler)を追加してから追加できます。 – Cochi

    関連する問題