Retrofit2结合RxJava2简单处理嵌套请求(flatMap)
来源:互联网 发布:usb虚拟打印机端口驱动 编辑:程序博客网 时间:2024/06/14 18:54
gradle
compile 'io.reactivex:rxjava:1.2.0'compile 'io.reactivex:rxandroid:1.2.1'compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:converter-gson:2.1.0'compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
(素材来源于http://www.jianshu.com/p/1fb294ec7e3b)
1重请求(也已经和正常的retrofit2请求完全不一样了,retrofit2被完全地封装到了rxjava2里)
首先接口的返回值(已经大不一样,返回的是rxjava2中的Observable,如果是retrofit2的话返回的应该是retrofit2.Call<UserInfo>)
interface MyService { @GET("user/login" ) Observable<UserInfo> login( @Query("username") String username, @Query("password") String password );}
具体使用
(通过接口获取Observable对象,doOnNext等同于写在onCompleted里)
(此外注意retrofit2在初始化的时候还要加上一行.addCallAdapterFactory(RxJavaCallAdapterFactory.create()))
service.login(phone, password) //获取Observable对象 .subscribeOn(Schedulers.newThread())//请求在新的线程中执行 .observeOn(Schedulers.io()) //请求完成后在io线程中执行 .doOnNext(new Action1<UserInfo>() { @Override public void call(UserInfo userInfo) { saveUserInfo(userInfo);//保存用户信息到本地 } }) .observeOn(AndroidSchedulers.mainThread())//最后在主线程中执行 .subscribe(new Subscriber<UserInfo>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { //请求失败 } @Override public void onNext(UserInfo userInfo) { //请求成功 } });
2重请求
//登录,获取token@GET("/login")public Observable<String> login( @Query("username") String username, @Query("password") String password); //根据token获取用户信息@GET("/user")public Observable<User> getUser( @Query("token") String token);//..................................service.login("11111", "22222") .flatMap(new Func1<String, Observable<User>>() { //得到token后获取用户信息 @Override public Observable<User> onNext(String token) { return service.getUser(token); }) .subscribeOn(Schedulers.newThread())//请求在新的线程中执行请求 .observeOn(Schedulers.io()) //请求完成后在io线程中执行 .doOnNext(new Action1<User>() { //保存用户信息到本地 @Override public void call(User userInfo) { saveUserInfo(userInfo); } }) .observeOn(AndroidSchedulers.mainThread())//在主线程中执行 .subscribe(new Observer<User>() { @Override public void onNext(User user) { //完成一次完整的登录请求 userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { //请求失败 } });
上面两个方法写在一个接口里了。
这里看起来就像是只有一个请求,尤其是retrofit2党更会不明所以。
其实他是先用账号密码登录了,再返回一个token,再用这个token请求user,再返回user对象。
显示返回了Observer<String>,再通过那个func1函数把数据源从String转化成了User。
url的变化流程是:账号密码-》token
请求的流程是:给账号密码-》拿token-》给token-》拿User对象。
接下来就是这个组合框架的威力了,不需要你写多个rxjava2的订阅了,把你所有的操作封装成一次请求(只是看起来)。你只需要合理提供转化多个url就可以了。
阅读全文
0 0
- Retrofit2结合RxJava2简单处理嵌套请求(flatMap)
- RxJava2和Retrofit2实现简单网络请求
- RxJava 处理请求嵌套-- flatMap、Map
- Rxjava2.0和Retrofit2.0结合使用(2)post请求
- 简单封装retrofit2+rxjava2
- Android使用Retrofit2.0和RxJava2.0处理网络请求
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- 简单上手的Retrofit2+Rxjava2网络请求框架
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- Retrofit2+RxJava2进行网络请求
- rxjava2 结合retrofit2进行业务封装
- Retrofit2.0与RXJava2.0最新结合:
- Android RxJava2+Retrofit2搭建网络请求框架
- rxjava2+rxandroid2+retrofit2 封装网络请求
- Retrofit2+Rxjava2如何主动取消网络请求
- Retrofit2+Rxjava2网络请求框架的封装
- RxEasyHttp一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
- RxJava2和Retrofit2.0的简单使用
- Flowable
- 动态代理的几种方式
- 读取多个CSV并将结果传送到GPU内核函数
- 每天一个linux命令目录
- 损失函数中正则化项L1和L2的理解
- Retrofit2结合RxJava2简单处理嵌套请求(flatMap)
- maven 整合支付宝,导入alipay-sdk-java包到本地仓库
- logistic回归,以及决策边界与回归的区别
- mongodb高可用副本和用户认证
- 专访鄢志杰:地铁进入语音购票时代,深度解读下一代人机语音交互技术
- Faster RCNN代码理解(Python)
- 通过hue提交oozie定时任务
- weblogic启动时闪退
- P1349 广义斐波那契数列(矩阵的应用)