RxJava实际应用--->网络请求嵌套回调
2018-07-03 本文已影响32人
谢尔顿
1.需求场景
嵌套的网络请求就是在第1个网络请求成功后,继续在进行一次网络请求,我们常见到的用例就是先进行用户注册的网络请求,待注册成功后再继续发送用户登录的请求。这种情况我们可以利用操作符FlatMap()实现。
2. 具体实现
这里只贴出与FlatMap相关的主要实现代码。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(UrlManager.BASE_URL_JS)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
RequestApi request = retrofit.create(RequestApi.class);
observable1 = request.register();
observable2 = request.login();
observable1
.subscribeOn(Schedulers.io()) //初始被观察者切换到IO线程进行注册请求
.observeOn(AndroidSchedulers.mainThread()) //新被观察者切换到主线程处理注册请求的结果
.doOnNext(new Consumer<TranslationBean>() {
@Override
public void accept(TranslationBean translationBean) throws Exception {
Log.d(Constant.TAG,"第1次网络请求成功");
Log.d(Constant.TAG,translationBean.getContent().getOut());
}
})
.observeOn(Schedulers.io()) //登陆请求切换到IO线程去发起
.flatMap(new Function<TranslationBean, ObservableSource<TranslationBean1>>() {//作变换,即作嵌套网络请求
@Override
public ObservableSource<TranslationBean1> apply(TranslationBean translationBean) throws Exception {
//将注册请求转成登陆请求,即发送登陆请求
return observable2;
}
})
.observeOn(AndroidSchedulers.mainThread()) //切换到主线程中对登陆请求的结果做处理
.subscribe(new Consumer<TranslationBean1>() {
@Override
public void accept(TranslationBean1 translationBean1) throws Exception {
Log.d(Constant.TAG,"第2次网络请求成功");
Log.d(Constant.TAG,translationBean1.getContent().getOut());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(Constant.TAG,"登陆失败");
}
});
3.测试结果
07-03 10:29:22.058 7244-7244/com.gjj.frame D/RxJava: 第1次网络请求成功
07-03 10:29:22.059 7244-7244/com.gjj.frame D/RxJava: hi registe
07-03 10:29:22.099 7244-7244/com.gjj.frame D/RxJava: 第2次网络请求成功
07-03 10:29:22.099 7244-7244/com.gjj.frame D/RxJava: hi login
参考文章: