Rxjava+Retrofit嵌套处理请求,并优雅的处理异常

前情提示:

本文只是一个例子,不做过多讲解,入门知识推荐参考

仍物线大神讲解的Rxjava,如何优雅的处理服务器异常,本文没有对Rxjava进行任何封装,也没有使用retrolambda,因为对于初学者来说,看起来费(不)劲(会),而且也没必要。


正文

 今天要写的例子是模拟 一个实际的登录请求。

1. 用户登录

2. 根据用户登录的返回结果(Status code),判断是否继续执行 查询用户


开始

1. 首先定义Services接口

public interface IUserServices {

    @POST("user/login")
    @FormUrlEncoded
    Observable login(@Field("acount")String acount, @Field("password") String password);

    @GET("user/{userid}")
    Observable> getUserById(@Path("userid")String userid);

}


2. 配置我们的OkHttpClient

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


3. 自定义返回对象

public class JsonResponse {

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


关于这个对象,我也是被折磨了很久之后,才封装的一个 响应实体,起初我的Services接口中的接口是这么写的:

 @GET("user/{userid}")
 Observable getUserById(@Path("userid")String userid);
可是当我发现转换的实体对象的值全为null的时候:

{id='null', acount='null', name='null', email='null', emailConfirmed='null', isLockedOut='null', enterpriseId='null', regAddress='null', mobilPhone='null', phone='null', description='null', creatDate='null', tokenTime='null', accessToken='null', headUrl=null, activiti=0, nickname='null', number=0}
我注意了下 服务器所返回的json字符串:

{"status":0,"data":{"id":null,"acount":"xxxxxxxxx","name":null,"email":null,"emailConfirmed":null,"isLocked....
,而我的User这个对象:

public class User implements Parcelable {
    
        private String id;
        private String acount;
        private String name;
        private String email;
        private String emailConfirmed;
        private String isLockedOut;
        private String enterpriseId;
        private String regAddress;
        private String mobilPhone;
      
,后端给我返回的是一个格式的json,所以我定义了JsonResponse


4. 开始请求

  mUserService=mRetrofit.create(IUserServices.class);
mIUserServices
                .login(username,pwd)  //登录请求,传入用户名和密码,返回Observable 对象
                .subscribeOn(Schedulers.io())  //事件产生在io线程
                .flatMap(new Func1>>() {
                    @Override
                    public Observable> 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, Observable>() {
                    @Override
                    public Observable call(JsonResponse userJsonResponse) {
                        return Observable.just(userJsonResponse.getData()); //将这个user发送出去
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @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);
                    }
                });


重点内容

  1. 当使用map时候,你就不能使用 Observable.error()了,它会继续往下执行,从而无法中断这次链式。你需要使用 throw new 一个异常
  2. 当使用flatmap时候,你要使用Observable.error()


你可能感兴趣的:(Rxjava)