流式调用(比如先调用注册--在调用登录)
//以下实现多个网络嵌套流式调用
/* observable1=request.getCall();
observable2=request.getCall_2();
observable1.subscribeOn(Schedulers.io()) // (初始被观察者)切换到IO线程进行网络请求1
.observeOn(AndroidSchedulers.mainThread()) // (新观察者)切换到主线程 处理网络请求1的结果
.doOnNext(new Consumer<Translation1>(){
@Override
public void accept(Translation1 result)throws Exception{
Log.d(TAG,"第1次网络请求成功");
result.show();
// 对第1次网络请求返回的结果进行操作 = 显示翻译结果
}
})
.observeOn(Schedulers.io()) // (新被观察者,同时也是新观察者)切换到IO线程去发起登录请求
// 特别注意:因为flatMap是对初始被观察者作变换,所以对于旧被观察者,它是新观察者,所以通过observeOn切换线程
// 但对于初始观察者,它则是新的被观察者
.flatMap(new Function<Translation1, ObservableSource<Translation2>>(){ // 作变换,即作嵌套网络请求
@Override
public ObservableSource<Translation2> apply(Translation1 result)throws Exception{
// 将网络请求1转换成网络请求2,即发送网络请求2
return observable2;
}
})
.observeOn(AndroidSchedulers.mainThread()) // (初始观察者)切换到主线程 处理网络请求2的结果
.subscribe(new Consumer<Translation2>(){
@Override
public void accept(Translation2 result)throws Exception{
Log.d(TAG,"第2次网络请求成功");
result.show();
// 对第2次网络请求返回的结果进行操作 = 显示翻译结果
}
},new Consumer<Throwable>(){
@Override
public void accept(Throwable throwable)throws Exception{
System.out.println("登录失败");
}*/
组合调用--需要同时请求,然后将返回的结果更新UI
//多个网络嵌套
Observable placeObservable = repository.getPlaceList(context);
Observable weatherObservable = ServiceManager.getInstance().getApiService().getWeatherInfo(place, Constants.BAIDU_AK);
Observable.merge(placeObservable, weatherObservable)
.subscribeOn(Schedulers.io())......
public void onNext (Object obj){
//多个请求返回的数据对象不一致,要分别判断并反馈给前台的UI
if (obj instanceof List) {
mMainView.setupPlaceData((List<Place>) obj);
} else if (obj instanceof WeatherResponse) {
mMainView.setupWeatherData((WeatherResponse) obj);
}
}
总结:网络嵌套是Rxjava强大功能中的一角,关键在熟练掌握提供的几个操作符map 、flatmap、merge等