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