rxjava2 结合retrofit2进行业务封装

来源:互联网 发布:怎么打开淘宝网址链接 编辑:程序博客网 时间:2024/06/05 14:33

rxjava2 结合retrofit2进行业务封装

第一步 添加依赖:

    compile 'io.reactivex.rxjava2:rxjava:2.0.0'    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'    compile 'com.squareup.retrofit2:converter-jackson:2.0.0'    compile 'com.squareup.retrofit2:retrofit:2.2.0' 

第二步 定义一个接口类 例如:

public interface UserService {@FormUrlEncoded@POST("user/getchecknum")Observable<BaseEntity<ChecknumBean>> getCheckNumber(@Field("phoneNum") String phoneNum);}

@FormUrlEncoded为URL编码 retrofit2.x必须要
@POST(“user/getchecknum”) 定义一个POST请求 user/getchecknum 为URL的一部分
getCheckNumber为一个普通的方法后来会调用 返回一个Observable,Observable的泛型为返回的数据用BaseEntity来接收
来看下BaseEntity:

public class BaseEntity<T> implements Serializable {    private int returnCode;    private String returnMsg;    private T data;      public int getReturnCode() {        return returnCode;    }    public void setReturnCode(int returnCode) {        this.returnCode = returnCode;    }    public String getReturnMsg() {        return returnMsg;    }    public void setReturnMsg(String returnMsg) {        this.returnMsg = returnMsg;    }    public T getData() {        return data;    }    public void setData(T data) {        this.data = data;    }}

再来看ChecknumBean:

        public class ChecknumBean {            private String checkNum;            public String getCheckNum() {                return checkNum;            }            public void setCheckNum(String checkNum) {                this.checkNum = checkNum;            }        }

第三步 创建Retrofit

我是这么创建的 你可以根据业务来创建:

public class RetroFactory {    private RetroFactory() {    }    private static String baseUrl = "http://58.213.75.45/gaojie/";    private static OkHttpClient httpClient = new OkHttpClient.Builder()            .connectTimeout(30, TimeUnit.SECONDS)            .readTimeout(30, TimeUnit.SECONDS)            .build();    private static UserService userService = new Retrofit.Builder()            .baseUrl(baseUrl)            .addConverterFactory(JacksonConverterFactory.create())            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())            .client(httpClient)            .build()            .create(UserService.class);    public static UserService getUserService() {        return userService;    }}

发送请求

RetroFactory.getUserService().getCheckNumber("13888888888")                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<BaseEntity<ChecknumBean>>() {                    @Override                    public void onSubscribe(Disposable d) {                    }                    @Override                    public void onNext(BaseEntity<ChecknumBean> value) {                    }                    @Override                    public void onError(Throwable e) {                    }                    @Override                    public void onComplete() {                    }                });

这是最简单的用法了. 用的最原始的Observer 返回的数据有成功 有失败 情况很多 我们可以创建个BaseObserver 来进行数据的预处理:

public abstract class MyObserver<T> implements Observer<BaseEntity<T>> {    @Override    public void onSubscribe(Disposable d) {    }    @Override    public void onNext(BaseEntity<T> value) {        if (value.getReturnCode() == 0) {            onHandleSuccess(value.getData());        } else {            onHandleError(value.getReturnCode(),value.getReturnMsg());        }    }    protected abstract void onHandleSuccess(T data);    protected abstract void onHandleError(int returnCode, String returnMsg);    @Override    public void onError(Throwable e) {    }    @Override    public void onComplete() {    }}

在这个预处理中我只是根据我自己的实际情况来做的 我们后来返回的returnCode==0的时候才算真正的成功 其他returnCode为其他情况 所以我就抽出两个方法让子类实现
在onError(Throwable e)中可以对异常进行统一的处理 就不用交个子类处理了
再次请求就是这么写了:

RetroFactory.getUserService().getCheckNumber("1388888888")                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new MyObserver<ChecknumBean>() {                    @Override                    protected void onHandleSuccess(ChecknumBean data) {                    }                    @Override                    protected void onHandleError(int returnCode, String returnMsg) {                    }                });
0 0
原创粉丝点击