封装RxJava+Retrofit+OkHttp系列——(二)自
2019-04-24 本文已影响2人
pokerfaceCmy
封装RxJava+Retrofit+OkHttp系列——(一)自动处理网络请求出错
完整项目Github地址:戳这里!!!
前言
使用上一篇说的方法封装完成后,我们的网络请求代码应该是这样的:
HttpManager.getInstance()
.getRetrofitService(ApiServer.class)
.getLogin("")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new .....);
存在的问题
还是不够简洁。每次调用真正的网络请求方法getLogin()之后,都要去切换一下线程,如果能省略掉着两行就好了。
解决办法
接着改些HttpManager类,让他能实现自动的线程转换
关键方法:
/**
* 线程转换
*
* @param <T> T
* @return ObservableTransformer
*/
private static <T> ObservableTransformer<T, T> apiIoToMain() {
return upstream -> upstream
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
ObservableTransformer是rxjava提供的转换器,不清楚怎么用没关系,知道这样写就好了,接下来写个方法来调用apiIoToMain()实现线程转换
public static <T> Observable<T> composeRequest(Observable<T> observable) {
return observable.compose(apiIoToMain());
}
调用线程转换的方法
/**
* 自动线程转换,返回observer交给调用者去处理
*
* @param map 登录参数
* @return Observable对象
*/
@Override
public Observable<BaseResponse<LoginBean>> getLogin(Map<String, Object> map) {
return HttpManager.composeRequest(HttpManager.create(LoginContract.Model.class).nameLogin(map));
}
最终的调用
在Activity或者presenter中调用:
new LoginModel().getLogin(treeMap).subscribe(new ...);
简简单单一句话,然后实现默认的onSuccess()回调方法,就能轻轻松松的访问网络请求了,是不是很爽呢?