2017-01-17 4 views
0

私は新しいAndriodプロジェクトでrxJava2と併せて改造を使用しています。私はrxJava 1の経験が限られています。これはrxJava2で行われますか?

私の質問には次のようなものがあります。私は間違っているかもしれないが、これはちょうどdoesn't私の訓練を受けていない目に非常にrxish見る:

public Single<Response<List<ProviderVO>>> getProviders(){ 
    if(Connectivity.isConnected(mContext)){ // test internet connection 
     return mRetrofitHelper.getProviderList() 
       .map(response -> { 
        if(response.code() == 200){ 
         return Response.success(response.body().getProviders() 
            ,response.raw()); 
        } else { 
         return Response.<List<ProviderVO>>error(response.code() 
            ,response.errorBody()); 
        } 
       }) 
       .doOnSuccess(response -> { 
        if(response.code() == 200){ 
         mPreferencesHelper.putProviderList(response.body()); 
        } 
       }); 
    } else { // use cached providers when not connected to the internet 
     List<ProviderVO> list = mPreferencesHelper.getProviderList(); 
     if (list != null){ 
      return Single.create(e -> e.onSuccess(Response.success(list))); 
     } else { 
      return Single.create(e -> e.onSuccess(Response.<List<ProviderVO>>error(400 
        ,ResponseBody.create(MediaType.parse("text/plain"), "")))); 
     } 
    } 
} 

答えて

1

を、少なくとも、あなたは、例えば、適切な方法にあなたのif/elseロジックのすべてを置く必要がありますこの:

.map(this::handleResponse) 
handleResponseがある

ここ
private ResponseState handleResponse(Response response) { 
    if(response.code() == 200){ 
      return Response.success(response.body().getProviders() 
          ,response.raw()); 
    } else { 
      return Response.error(response.code() 
          ,response.errorBody()); 
    } 
} 

、応答が成功した場合、またはResponseStateは旗を持っているいくつかのクラスであるように、あなたが再書き込みが可能

.map(response -> { 
       if(response.code() == 200){ 
        return Response.success(response.body().getProviders() 
           ,response.raw()); 
       } else { 
        return Response.<List<ProviderVO>>error(response.code() 
           ,response.errorBody()); 
       }}) 

ない。

また、あなたは、このような場合のための追加のメソッドを書くことができます:あなたのための

import io.reactivex.functions.Function; 

public static <T, R> Function<? super T, ? extends Observable<? extends R>> decision(
     Function<T, Boolean> predicate, 
     Function<? super T, ? extends Observable<? extends R>> ifTrue, 
     Function<? super T, ? extends Observable<? extends R>> ifFalse) { 
    return (item) -> predicate.apply(item) 
      ? ifTrue.apply(item) 
      : ifFalse.apply(item); 
} 

private ResponseState handleResponse(Response response) { 
    return decision(response -> response.code() == 200, 
      response -> Response.success(response.body().getProviders(), response.raw()), 
      response -> Response.error(response.code(),response.errorBody())); 

} 
+0

おかげで入力を。 :) – zetain

関連する問題