RxJava实际应用--->网络请求嵌套回调


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() {
                    @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>() {//作变换,即作嵌套网络请求
                    @Override
                    public ObservableSource apply(TranslationBean translationBean) throws Exception {
                        //将注册请求转成登陆请求,即发送登陆请求
                        return observable2;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())  //切换到主线程中对登陆请求的结果做处理
                .subscribe(new Consumer() {
                    @Override
                    public void accept(TranslationBean1 translationBean1) throws Exception {

                        Log.d(Constant.TAG,"第2次网络请求成功");
                        Log.d(Constant.TAG,translationBean1.getContent().getOut());
                    }
                }, new Consumer() {
                    @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

参考文章:

  • Android RxJava 实际应用讲解:网络请求嵌套回调

你可能感兴趣的:(RxJava实际应用--->网络请求嵌套回调)