直入主题,用过rxjava retrofit的同学写一个网络请求 原始的可能是这样
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API.BASE_URL)//基础URL 建议以 / 结尾
.addConverterFactory(GsonConverterFactory.create())//设置 Json 转换器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//RxJava 适配器
.build();
RxWeatherService rxjavaService = retrofit.create(api .class);
apiService .getMessage("xxx")
.subscribeOn(Schedulers.io())//IO线程加载数据
.observeOn(AndroidSchedulers.mainThread())//主线程显示数据
.subscribe(new Subscriber<T>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(T t) {
}
});
当然肯定会做一下封装 变成了这样
HttpService.getInstance().getMessage(pageNo) //retrofit 单例
.compose(RxHelper.<T>handleResult()) //线程切换 )
.compose(rxlife)//绑定生命周期之类的库
// .map(new fun)//一些操作
//.flatMap()//一些操作
.subscribe(new cusTomSubscriber<T>() { //自定义的回调
@Override
protected void onSucess(T) {
// todo
}
@Override
protected void onFail(String message) {
//todo
}
});
封装到这个部分也差不多没啥问题了。 retrofit单例,线程切换封装,网络返回的json全局处理/dialog等等,关联Activity/Fragment生命周期,也没用打破rxjava的链式调用(网上很多封装的完全打破了rxjava该有的意义) 说到这里 个人仍然认为还是写一堆代码,如果能直接写 api+回调接口 就完成一个网络请求那可以省好多事情 所以我切换到了kotlin
先看一下最终的结果
Http.getInstance().getMessage().get(this) { it:T
//todo something
}
是的,这样就完了。只需要写出 api接口 一个括号(回调)就完成了所有的事情
核心代码是 kotlin 扩展函数+高阶函数(默认参数,命名参数)
fun <T> Observable<BaseModel<T>>.get(context: Context, isShowDialog: Boolean = false, message: String? = "请稍候", title: String? = "", next: (T) -> Unit, err: (mS: String?) -> Unit) {
this.compose(RxCompose.handleResult<T>(context as LifecycleOwner)).subscribe(object : MySubscriber<T>(if (isShowDialog) context else null, message, title) {
override fun onSucess(t: T) {
next(t)
}
override fun onFail(message: String?) {
err(message)
}
})
}
//线程切换 结果简单处理(其实可以放到其他操作符专门处理,这里简单处理一下),生命周期绑定
fun <T> handleResult(context: LifecycleOwner): ObservableTransformer<BaseModel<T>, T> {
return ObservableTransformer { upstream ->
upstream.flatMap {
if (it.code == 200) {
createData(it.data)
} else {
Observable.error(ServerException(it.msg))
}
}.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.compose(RxLife.with(context).bindToLifecycle())
}
}
解释一下:get为 observeable 扩展函数 next: (T) -> Unit 为传入的函数(我们所需要的网络数据), err: (mS: String?) -> Unit 为错误信息 RxCompose.handleResult(context as LifecycleOwner) 是线程切换+生命周期绑定(这里使用到了一个童鞋的生命周期库,不用继承Activity/fragment,等下在文末贴出) LifecycleOwner 为谷歌官方生命周期库 神器 (默认Activity已经实现此接口,所以传入context即可)
感谢文献
- 绑定生命周期库 github.com/dhhAndroid/…
- rxjava github.com/ReactiveX/R…