2017-05-04 7 views
0

ユーザエンドポイントへの単純なAPIコール(新しいユーザの登録)を行い、レスポンスで認証トークンを取得します。誰もこの2つのネットワークコールの違いを説明することができますし、どのような実装が私のケースで正しいものですか?RXJavaとRetrofitが正しく実装されたネットワークコール - Android

private void registerProcess(User user) { 
    mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<Response<TokenResponse>>() { 
       @Override 
       public void call(Response<TokenResponse> tokenResponse) { 
        if (tokenResponse.code() == 200) { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration success!"); 
        } else { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration failed"); 
        } 

       } 
      })); 

} 

private void registerProcess(User user) { 

    Network.getRetrofit().getUserToken(user) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Response<TokenResponse>>() { 
       @Override 
       public void onCompleted() { 
        /// what to do here??? 
       } 

       @Override 
       public void onError(Throwable e) { 
        mProgressbar.setVisibility(View.GONE); 
        showSnackBarMessage("Registration failed"); 
       } 

       @Override 
       public void onNext(Response<TokenResponse> tokenResponse) { 
        if (tokenResponse.code() == 200) { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration success!"); 
        } 
       } 
      }); 

} 

答えて

1

最初のケース:

  • は、したがって、例えば、IOExceptionアプリがクラッシュします、何onErrorコールバックの取り扱いはありません。

第二:それはまだ実行している場合漏れ例えばアクティビティのonDestroyコールバックに解除しないよう

  • サブスクリプションは、(最初​​の場合とは異なり)どこにも格納されていません。
  • onNextは成功した応答しか処理しないため、200とは異なるHTTPコードがある場合は何も起こりません。
    private void registerProcess(User user) { 
        mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(new Subscriber<Response<TokenResponse>>() { 
          @Override 
          public void onCompleted() { 
           // you might do nothing here 
          } 
    
          @Override 
          public void onError(Throwable e) { 
           mProgressbar.setVisibility(View.GONE); 
           showSnackBarMessage("Error!"); 
          } 
    
          @Override 
          public void onNext(Response<TokenResponse> tokenResponse) { 
           if (tokenResponse.code() == 200) { 
            mProgressbar.setVisibility(View.GONE); 
            showSnackBarMessage("Registration success!"); 
           } else { 
            mProgressbar.setVisibility(View.GONE); 
            showSnackBarMessage("Registration failed"); 
           } 
          } 
         }); 
    } 
    

    が全て格納されたサブスクリプションを解除するために、活性(またはその断片)が破棄されるときmSubscriptions.clear()を呼び出すことを忘れてはいけない:

正しい実装では、これら二つの断片の融合です。

P.S.doOnSubscribedoAfterTerminate演算子を使用して、初期状態ビューと終端ビューの状態を適切に設定できます。たとえば、複数の電話番号をmProgressbar.setVisibility(View.GONE)に送信しないようにするには、

mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
    .doOnSubscribe(() -> mProgressbar.setVisibility(View.VISIBLE)) 
    .doAfterterminate(() -> mProgressbar.setVisibility(View.GONE)) 
    ... 
+0

ありがとうございました! – MikeB

+0

'.subscribe(新しいアクション1 (){ @Override公共ボイドコール(TokenResponse応答){ RegisterFragment.this.handleResponse(応答); }}、新しいアクション1 (){ @Override public void call(Throwable error){ RegisterFragment.this.handleError(error); } '' 'それは機能しますか? – MikeB

+0

うん、確かに、あなたは' onComplete'の処理を緩めます。 –

関連する問題