Rxjava的多层嵌套

熊猫卓Sun 2020年05月08日 200次浏览

在线微信dat文件还原工具 微信dat在线还原https://blog.9035shop.cn/

流式调用(比如先调用注册--在调用登录)

//以下实现多个网络嵌套流式调用

/*      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等