1

ログインを検証するためにネットワーク呼び出しを実装しましたが、これは正常に機能しています。ログインが成功した後、ユーザーのデータを取得するために別の呼び出しを行う際に問題に直面しています。

API 呼び出しは次のとおりです。

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 -------------

@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());
                }
            });

subscribe メソッドでこのようにするのは正しいですか? onNext のオブジェクトの結果をキャストする必要がありますか?

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

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

4

2 に答える 2

4

オペレーターは、.flatMapある API 呼び出しを行ってから別の API 呼び出しを行うのに最適な方法です。ここでそれについて読んでください:http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/「それはさらに良くなる」部分。

.flatMapオブザーバブルを別のものに変更できます。つまり、前の結果を使用して新しい API 呼び出しを行い、一連のイベントを実装できます。これを行うと、Subscriber は から受信したオブザーバブルに対して呼び出され.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 つのイベントを生成してから完了します。登録解除スケジューラを設定する必要はありません。

于 2016-06-18T10:37:45.063 に答える