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