2016-06-17 5 views
1

ログインを検証するためにネットワークコールを実装しましたが正常に動作しています。私はちょうど、ログインが成功した後にユーザーのデータを取得するために別の呼び出しを行うことにいくつかの問題に直面しています。RxJavaとRetrofit 2を使ってログイン成功後何かをしてください2

RestApi restApi = ServiceRest.createRetrofitService(RestApi.class, UrlServer.URL_SERVER); 
Observable<Response<User>> responseObservable = restApi.getUser(user); 
responseObservable.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .unsubscribeOn(Schedulers.io()) 
     .subscribe(new Subscriber<Response<User>>() { 
      @Override 
      public void onCompleted() { 
       Log.i("LoginActivity", "[onCompleted]"); 
       progressDialog.dismiss(); 
      } 

      @Override 
      public void onError(Throwable e) { 
       progressDialog.dismiss(); 
       Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onNext(Response<User> userResponse) { 
       //Do stuff to go to another Activity 
      } 
     }); 


-------------編集#1 -------------:ここ

は、APIの呼び出しです

私は@Tassosはこのように提案し何を実装:

responseUser 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .map(new Func1<Response<User>, Observable<Response<Object>>>() { 
       @Override 
       public Observable<Response<Object>> call(Response<User> userResponse) { 
        Log.d("USER", userResponse.body().getName()); 
        return restApi.getData(userResponse.body().getToken()); 
       } 
      }) 
      .doOnError(new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        Toast.makeText(LoginActivity.this, "Error[doOnError]: " + throwable.toString(), Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .subscribe(new Subscriber<Object>() { 
       @Override 
       public void onCompleted() { 
        Log.i("LoginActivity", "[onCompleted]"); 
       } 
       @Override 
       public void onError(Throwable e) { 
        Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
       @Override 
       public void onNext(Object result) { 
        Log.d("RESPONSE", result.toString()); 
       } 
      }); 

を購読方法で、このように行うのは、それは正しいですか? onNextのObject結果をキャストする必要がありますか?

// ------------------------------------------- -------------------------------- //

私は、ログインが成功した後、 ResponseオブジェクトUserを介して取得したトークンを使用して別のURLに送信し、ヘッダーのAuthorizationとして他のAPI呼び出し(Observable<Response<Object>> getData(@Header("Authorization") String token);)に送信します。 flatMapとZipを使ってみましたが、この作業を実行できませんでした。
アドバイスはありますか?このコンセプトは私には新しいものです。

答えて

2

実際にはダイアログを閉じる必要がありますか?他のコールを行う前にダイアログを閉じる必要がありますか?

.unsubscribeOn(Schedulers.io()) 
    .map(userResponse -> { /* do the other calls */ } 
    .subscribe(new Subscriber<?>() {... 
+0

実際、私はそれについて考えていました。他の呼び出しを行う前にダイアログを閉じる必要はありません。ダイアログを保持し、メッセージを「ユーザーの確認」から「ユーザーのデータを取得する」に変更する必要があります。ダイアログが終了した最後の呼び出しの終了。ありがとう! あなたの提案を実装しようとする問題に直面しています。自分の質問を編集して、私が行ったことを表示します。 –

2

.flatMapオペレータは、1つのAPIコールを実行して別のコールを実行するのに最適な方法です。ここでそれについて読む:http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/ "それはより良くなった"部分。

.flatMapは、1つの観測値を別の観測値に変更することができます。すなわち、以前の結果を使用して新しいAPI呼び出しを行い、一連のイベントを実装します。これを行うと、サブスクライバーは.flatMapから受信された観測値に対して呼び出されます。

あなただけの書き込み:

restApi.getUser(user) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(userResponse -> restApi.getData(userResponse.getToken())) 
    .doOnError(e -> Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show()) 
    .doOnTerminate(() -> progressDialog.dismiss()) 
    .subscribe(response -> proceedWithLogin()) 

をまたなぜあなたは.unsubscribeOn(Schedulers.io())を使用していますか?レトロフィットオブザーバブルを使用すると、通常は1つのイベントが生成されて完了し、スケジューラの設定を解除する必要はありません。

+0

あなたのソリューションを試しましたが、 "java.net.SocketTimeoutException'"が返されてから "rx.exceptions .OnErrorNotImplementedException' "私はdoOnErrorを実装しました –

+0

面白いです。 'java.net.SocketTimeoutException'は' getUser'または 'getData'によって引き起こされますか? 'OnErrorNotImplementedException'はObservableにエラーハンドリングが提供されていないことを意味するので、' .subscribe(response - > proceedWithLogin()、 throwable - > Log.d( "Error"、throwable.getMessage()) 'を試すことができます。 – aleien

+0

Myそれは 'です。doOnError'はエラー応答が返されたときに呼び出されますが、SubscriberのonError呼び出しの実装に代わるものではありません。 – aleien

関連する問題