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