2017-12-07 12 views
0

に基づいて異なるルートを取ります。ただし、サーバーが検証エラーを返すときに問題が発生します。私はいくつかの異なった理由のためにこのソリューションを好きではないRxJava2シングルは、私は次のコードを持っているアイテム

Observable<Response<User>> observable_from_api = 
     service.attemptLogin(username, password) 
       .share(); 

observable_from_api 
     .filter(response -> response.code() == HttpStatus.HTTP_STATUS_200_OK) 
     .//handle logic for success 

observable_from_api 
     .filter(response -> response.code() == HttpStatus.HTTP_STATUS_400_BAD_REQUEST) 
     .//handle logic for validation errors 

:だから、どこか私のストリームでは、私は次のように、私が以前に実装したソリューションである

if(response.code() == 201){ 
    // CONTINUE STREAM USING THE LOGIC THAT HANDLES SUCCESS 
}elseif(response.code() == 400){ 
    // CONTINUE STREAM USING LOGIC TO HANDLE THE VALIDATION ERRORS 
} 

と同等のものを持っていると思います。主なものはちょうど正しいとは思わない。 2番目の方法は、.share()メソッドがObservableオブジェクトでのみ使用可能であることです。私のネットワーク操作は1つのレスポンスしか出さないので、代わりにを使いますが、そこでは.share()メソッドは使用できません。

これが重複した質問である場合は、私はいくつかの掘り出し物を行い、私が言及した解決策を見つけただけです。私は最適な解を見たい、あるいはこれが実際に最適解であることを明示的に伝えたい。

答えて

1

消費者がどの種類のデータを受け取るべきかを定義する必要があると思います。私はあなたが消費者にUserオブジェクトを受け取りたいと思っています。

これら

は、作成すべきメソッドのシグネチャです:

Single<User> handleSuccess(Response<User> response) 

Single<User> handleError(Response<User> response) 

をそしてあなたは、このようにストリームを作成:

service.registerUser() 
    .flatMap(response -> { 
     if (response.success) { 
      return handleSuccess(response); 
      } else { 
      return handleError(response); 
      } 
    }) 
.subscribe(user -> logd("user: " + user.name)); 
+0

することもできますSingle.error(yourException)、へエラーダウンストリームを伝搬する。 – elmorabea

+0

これもオプションですが、サブスクライバ内のすべての 'handleError'ロジックを移動する必要があります – GVillani82

関連する問題