前情提示: 本文只是一个例子,不做过多讲解,入门知识推荐参考 仍物线大神讲解的Rxjava,如何优雅的处理服务器异常,本文没有对Rxjava进行任何封装,也没有使用retrolambda,因为对于初学者来说,看起来费(不)劲(会),而且也没必要。 另外你可以直接看总结,当然如果你只想了解如何处理异常。
正文 今天要写的例子是模拟 一个实际的登录请求。 1. 用户登录 2. 根据用户登录的返回结果(Status code),判断是否继续执行 查询用户
开始 1. 首先定义Services接口 public interface IUserServices {
@POST("user/login")@FormUrlEncodedObservable<ResponseBody> login(@Field("acount")String acount, @Field("passWord") String password);@GET("user/{userid}")Observable<JsonResponse<User>> getUserById(@Path("userid")String userid);}
配置我们的OkHttpClientOkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new LogingInterceptor()) .retryOnConnectionFailure(true) .addInterceptor(responselog) .addNetworkInterceptor(new TokenInterceptor()) .build();配置Retrofit mRetrofit = new Retrofit.Builder() .baseUrl(ConstandUtils.SERVICE_BASEURL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson)) .client(client) .build();自定义返回对象public class JsonResponse<T> { PRivate int status; //状态码 status_code private T data; public int getStatus_code() { return status; } public void setStatus_code(int status_code) { this.status = status_code; } public T getData() { return data; } public void setData(T data) { this.data = data; }}关于这个对象,是为了结构化的Json而封装的实体,起初我的Services接口中的接口是这么写的:
@GET("user/{userid}") Observable<User> getUserById(@Path("userid")String userid);可是当我发现转换的实体对象的值全为null的时候:
{id='null', acount='null', name='null', email='null', emailConfirmed='null'....}我注意了下 服务器所返回的json字符串:
{"status":0,"data":{"id":null,"acount":"xxxxxxxxx","name":null,"email":null,"emailConfirmed":null,"isLocked....当然现在的后台返回的数据大部分都是结构化的,所以这个问题只是当时我没注意引起的。
开始请求mUserService=mRetrofit.create(IUserServices.class);mIUserServices .login(username,pwd) //登录请求,传入用户名和密码,返回Observable<ResponseBody> 对象 .subscribeOn(Schedulers.io()) //事件产生在io线程 .flatMap(new Func1<ResponseBody, Observable<JsonResponse<User>>>() { @Override public Observable<JsonResponse<User>> call(ResponseBody responseBody) { String userid = parse_Login(responseBody); //解析这个Response(相当于在解析 json),得到userid if("error".equals(userid)) { //status code >0 返回error,表示请求有误 return Observable.error(new Throwable("信息错误"));//随便返回了一个错误信息 } return mIUserServices.getUserById(userid); //如果有,证明请求成功,那么去查询用户 } }) .flatMap(new Func1<JsonResponse<User>, Observable<User>>() { @Override public Observable<User> call(JsonResponse<User> userJsonResponse) { return Observable.just(userJsonResponse.getData()); //将这个user发送出去 } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { mPresenter.onError(e.getMessage()); } @Override public void onNext(User user) { System.out.println("--->user"+user); } });重点内容
当使用map时候,你就不能使用 Observable.error()了,它会继续往下执行,从而无法中断这次链式。你需要使用 throw new 一个异常当使用flatmap时候,你要使用Observable.error()就这样。一个成功的嵌套请求+优雅的对Status code处理示例
新闻热点
疑难解答