Rxjava多网络嵌套--mark

作者: Mr_FengQi | 来源:发表于2018-07-10 17:21 被阅读8次

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

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

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

    相关文章

      网友评论

        本文标题:Rxjava多网络嵌套--mark

        本文链接:https://www.haomeiwen.com/subject/mylqpftx.html