这是在 rxJava2 中完成的吗?
Is this done in rxJava2?
我在我的新 Andriod 项目中结合使用 retrofit 和 rxJava2。我对 rxJava 1 的经验有限。
我的问题是:有没有更好的写法?我可能是错的,但在我未经训练的眼睛看来,这看起来不是很 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"), ""))));
}
}
}
至少,您应该将所有 if/else 逻辑放入适当的方法中,例如这个:
.map(response -> {
if(response.code() == 200){
return Response.success(response.body().getProviders()
,response.raw());
} else {
return Response.<List<ProviderVO>>error(response.code()
,response.errorBody());
}})
你可以re-write喜欢:
.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
是一些 class 有响应成功与否的标志。
此外,您可以为这种情况编写一个额外的方法:
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()));
}
我在我的新 Andriod 项目中结合使用 retrofit 和 rxJava2。我对 rxJava 1 的经验有限。
我的问题是:有没有更好的写法?我可能是错的,但在我未经训练的眼睛看来,这看起来不是很 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"), ""))));
}
}
}
至少,您应该将所有 if/else 逻辑放入适当的方法中,例如这个:
.map(response -> {
if(response.code() == 200){
return Response.success(response.body().getProviders()
,response.raw());
} else {
return Response.<List<ProviderVO>>error(response.code()
,response.errorBody());
}})
你可以re-write喜欢:
.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
是一些 class 有响应成功与否的标志。
此外,您可以为这种情况编写一个额外的方法:
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()));
}