@GET("news/index/{id}/")
Observable<CodeResponse<List<NewExpressEnetity>>> getNew24Data(@Path("id") int id);
/**
* 处理上游数据
*
* @param <T>
*/
public static <T> ObservableTransformer<CodeResponse<T>, CodeResponse<T>> handleResponse() {
// 一旦源Observable遇到错误,这个onErrorResumeNext会把源Observable用一个新的Observable替掉,
// 然后这个新的Observable如果没遇到什么问题就会释放item给Observer
return upstream -> upstream
.onErrorResumeNext(new CodeResponseTransformer.ErrorResumeFunction<>())
.flatMap(new CodeResponseTransformer.ResponseFunction<>());
}
/**
* 非服务器产生的异常,比如本地无网络请求,Json数据解析错误等等。
*
* @param <T>
*/
private static class ErrorResumeFunction<T> implements Function<Throwable, ObservableSource<? extends CodeResponse<T>>> {
@Override
public ObservableSource<? extends CodeResponse<T>> apply(Throwable throwable) throws Exception {
return Observable.error(LocalException.handleException(throwable));
}
}
/**
* 服务其返回的数据解析
* 正常服务器返回数据和服务器可能产出的exception
*
* @param <T>
*/
private static class ResponseFunction<T> implements Function<CodeResponse<T>, ObservableSource<CodeResponse<T>>> {
@Override
public ObservableSource<CodeResponse<T>> apply(CodeResponse<T> tResponse) {
String code = tResponse.getCode();
if (code.equals("0")) {
// 这里也可以对正常数据做一些统一处理
return Observable.just(tResponse);
} else {
// 对异常进行统一处理
return Observable.error(new ApiException(code, tResponse.getMsg()));
}
}
}
private Map<String, Retrofit> retrofits = Collections.synchronizedMap(new HashMap<String, Retrofit>());
RetrofitManager.getInstance()
.getRetrofit(NewsService.API_BASE_URL)
.create(NewsService::class.java)
.getNew24Data(1)
.compose(CodeResponseTransformer.handleResponse())
.compose(SchedulerProvider.getInstance().applySchedulers())
.subscribe({
Log.d("apiSuccess", it.toString())
}, { throwable ->
if(throwable is ApiException){
Log.d("apiException", "${throwable.code}+${throwable.msg}")
}else{
Log.d("apiException", "${throwable.message}")
}
})