解决问题
- 解决不同基类BaseBean的返回结果判断 (参照 mp.weixin.qq.com/s/Qu-sNjU9u… )
- lifecycle 解决页面生命周期问题 不需要引入三方的AUtoDispose 或者 RxLifeCycle 类库
初始化
初始化配置参数按需要来配置
RxHttp.initConfig(new ConfigModule() {
@Override
public void applyOptions(GlobalConfigBuild.Builder builder) {
builder
.addInterceptor(new LoggerInterceptor())
.baseurl("http://lf.snssdk.com/api/")
.setPaeseInfor(new ParseInfo("errorCode", "data", "errorMsg", "0"))
.setAPICallBack(new APICallBack() {
@Override
public String callback(String code, String resultData) {
return null;
}
});
}
});
基类封装方式
框架是基于Rxjava的 所以可以使用map操作符 去将接口返回的String 做一层过滤去获取到返回数据的code mes data 这里可以对数据状态进行统一判断 数据获取争取返回字符串类型的data 当然也可以将data json格式化之后再返回,这里我们这个map 只做数据状态的判断,下边是整个状态判断的代码
RxHttp
.create() //一 .获取BaseApi
.get("https://www.wanandroid.com/banner/json", SimpleParams.create().put("", "")) //二. 调用请求方法
.compose(Transformer.switchSchedulersArray(DataBean.class)) //三. 返回结果处理
.subscribe(new CommonObserver<List<DataBean>>(mBaseView) { //四.发起订阅
@Override
public void onNext(List<DataBean> dataBeans) {
DataBean dataBean = dataBeans.get(0);
System.out.println(dataBean.getDesc());
}
@Override
protected void onError(int code, String mes) {
super.onError(code, mes);
System.out.println(code + "===" + mes);
}
});
这里我们直接使用 的BaseApi 当然我们也可以使用自己定义的APi 可以调用creata()的另一个有参方法 传入我们自定义的请求APi,自定义APi 返回值可以是String 也可以是业务实体. 如果是业务实体 那在compose里可以不使用我们封装的转换方式,只需要做线程切换即可.可以调用Transformer 的另一个方法switchThread 值进行线程的切换. 如果返回值没有基类的 code msg data 可以直接使用可以调用Transformer的switchSchedulersNoBase方法 直接转成业务实体 自定义Api 使用方式如下
RxHttp
.create(ApiServer.class)
.get("client_credentials",
"PPSSlAbaCYZpe8IhLQwWWinS",
"noqd2GKQmrpwhLu3hEuUi9X5cGQDfGw6")
.compose(Transformer.<ResToken>switchThread())
.subscribe(new CommonObserver<ResToken>(mBaseView) {
@Override
public void onNext(ResToken resToken) {
System.out.println(resToken.access_token);
}
@Override
protected void onError(int code, String mes) {
super.onError(code, mes);
System.out.println(code + "=====" + mes);
}
});
RxHttp
.create()
.get("https://aip.baidubce.com/oauth/2.0/token", SimpleParams.create()
.put("grant_type", "client_credentials")
.put("client_id", "PPSSlAbaCYZpe8IhLQwWWinS")
.put("client_secret", "noqd2GKQmrpwhLu3hEuUi9X5cGQDfGw6"))
.compose(Transformer.switchSchedulersNoBase(ResToken.class))
.observeOn(Schedulers.io())
.flatMap(new Function<ResToken, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(ResToken resToken) throws Exception {
System.out.println("============Token 请求成功");
ReqToken reqToken = new ReqToken();
reqToken.image = "2164728647816478264781242746127846";
reqToken.image_type = "BASE64";
reqToken.face_field = "age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities";
reqToken.max_face_num = "10";
reqToken.face_type = "LIVE";
reqToken.access_token = resToken.access_token;
return RxHttp
.create()
.post("https://aip.baidubce.com/rest/2.0/face/v3/detect", reqToken)
.compose(Transformer.<String>switchThread());
}
})
.subscribe(new CommonObserver<String>(mBaseView) {
@Override
public void onNext(String s) {
System.out.println("=======" + s);
}
@Override
protected void onError(int code, String mes) {
super.onError(code, mes);
}
});
}
生命周期的管理
生命周期使用jetpacK的 lifecycle 管理, 可以在被订阅者里注册lifecycle 监听周期变化 也可以自定义操作符来实现,可以在Rxjava 订阅时构造函数中传入 Lifecycle对象进行注册 ,在onSubscribe 回调中得到 Disposable 在onDestroy中去对Disposable 做取消操作
public abstract class BaseObserver<T> implements Observer<T>, LifecycleObserver {
/**
*要想实现生命周期的去掉订阅操作必须传入可以获取到lifeCycle 的对象
*
* @param lifecycle
*/
public BaseObserver(Object lifecycle) {
if (lifecycle != null) {
if (lifecycle instanceof AppCompatActivity) {
((AppCompatActivity) lifecycle).getLifecycle().addObserver(this);
return;
}
if (lifecycle instanceof Fragment) {
((Fragment) lifecycle).getLifecycle().addObserver(this);
return;
}
if (lifecycle instanceof Lifecycle) {
((Lifecycle) lifecycle).addObserver(this);
return;
}
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
BaseException apiException = null;
if (e instanceof BaseException) {
apiException = (BaseException) e;
} else {
apiException = getErrorType(e);
}
String message = apiException.getMessage();
int code = apiException.getCode();
onError(code, message);
}
@Override
public void onComplete() {
}
protected void onError(int code, String mes) {
}
protected BaseException getErrorType(Throwable e) {
return DefaultException.handleException(e);
}
private Disposable disposable;
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
private final void cancel(LifecycleOwner owner) {
if (this.disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
if (owner != null) {
owner.getLifecycle().removeObserver(this);
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner owner) {
this.cancel(owner);
}
}