简介
面试的时候,我只是看了简单的看了下,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 查看本文章