2017-01-17 5 views
0

Ich verwende Retrofit in Verbindung mit rxJava2 in meinem neuen Andriod-Projekt. Ich habe begrenzte Erfahrung mit rxJava 1.Ist dies in rxJava2 getan?

Meine Frage wäre: Gibt es eine bessere Möglichkeit, dies zu schreiben? Ich kann mich irren, aber Dies hat keinen nur sehen sehr rxish meinem ungeschulten Augen:

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"), "")))); 
     } 
    } 
} 

Antwort

1

Wenigstens Sie alle von if/else-Logik in geeignete Methoden setzen sollte, zum Beispiel dies:

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

Sie können neu schreiben wie:

.map(this::handleResponse) 

wo handleResponse sind:

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

Hier sind ResponseState einige Klassen, die eine Fahne hat, wenn die Antwort erfolgreich war oder nicht.

Darüber hinaus können Sie ein zusätzliches Verfahren für solche Fälle schreiben:

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

Dank für Sie die Eingabe. :) – zetain