Retrofit+Rxjava解决链式请求问题

简介

面试的时候,我只是看了简单的看了下,Rxjava+Retrofit做请求的简单应用,当时也没发现有啥好的地方,面试官问了我个问题,你用Retrofit是如何解决链式请求问题的?,当时我懵逼了啥是链式请求啊,回去后正式学习,我才发现这玩意太TM强大了,给我的感觉就是2个字舒坦,看的舒坦,写的也舒坦

场景

以前的请求都是抽取了get(String url,CallBack callBace),大家肯定都遇到过这样的一个需求,展示一个界面需要请求2个接口,A接口请求成功后,在请求B接口

这个需求是不是很头疼,以前的实现逻辑是,在A接口的成功回调中请求B接口,B接口请求回调成功后,把A数据+B数据组装,如果不抽取个方法,代码大家想想多恐怖

类似这样,这还是2个链式请求,3个,4个呢???太恶心了

        Call call = httpClient.newCall();
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Call call2 = httpClient.newCall(null);
                call2.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {

                    }
                });
            }
        });
实战

当登陆成功以后,请求testGet接口

public interface LoginApi {
    @FormUrlEncoded
    @POST("/e/member/ajaxlogin/")
    Observable<UserInfo> login(@FieldMap Map<String, String> parameters);

    @GET("/")
    Observable<ResponseBody> testGet();
}
 @Override
    public void testGet() {
        //构造请求参数
        Map<String, String> parameters = new HashMap<>();
        parameters.put("username", "awen");
        parameters.put("password", "123");
        parameters.put("enews", "login");
        parameters.put("lifetime", "315360000");
        //请求核心
        final LoginApi api = RetrofitCreateHelper.getHelper()
                .createApi(LoginApi.class);

        // 开始请求
        api
                .login(parameters)
                .map(new Func1<UserInfo, String>() {
                    @Override
                    public String call(UserInfo userInfo) {
                        // 得到登陆成功的UserInfo对象
                        return new Gson().toJson(userInfo);
                    }
                })
                .flatMap(new Func1<String, Observable<ResponseBody>>() {
                    @Override
                    public Observable<ResponseBody> call(String s) {
                        // 根据login接口返回的数据(当然我这里不需要) 转换成请求testGet的Observable对象
                        return api.testGet();
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onCompleted() {
                        Log.d("wyz", "请求完成");
                    }

                    @Override
                    public void onError(Throwable e) {
                        // 所有的错误回调 都会在这里调用
                        Log.d("wyz", "请求出错:" + e.getMessage());
                    }

                    @Override
                    public void onNext(ResponseBody data) {
                        try {
                            Log.d("wyz", "请求成功:"+new String(data.bytes(),"gb2312"));
                        } catch (IOException e) {

                        }
                    }
                });
    }

看看 是不是很舒服啊,一路这是2个,如果多个只需要在使用flatMap操作符继续转换即可哦

原理

这要多写Rxjava库的帮助,核心是靠flatMap将登录成功的数据通过flatMap操作符,转换成另外一个Observaber对象继续请求,map操作符是可选的,按照你的需求,如果B请求依赖A请求的数据,可以通过map操作符将A请求返回的数据,转换成B请求的参数

Rxjava处理数据是以流的形式进行处理,流水线操作



扫描二维码关注公众号,回复: 1269676 查看本文章

猜你喜欢

转载自blog.csdn.net/wenyingzhi/article/details/80513729