Retrofit2结合RxJava2简单处理嵌套请求(flatMap)

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

 
  
interface MyService { @GET( "user/login" ) Observable 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() {
            @Override
            public void call(UserInfo userInfo) {
                saveUserInfo(userInfo);//保存用户信息到本地
            }
        })
        .observeOn(AndroidSchedulers.mainThread())//最后在主线程中执行
        .subscribe(new Subscriber() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                //请求失败
            }

            @Override
            public void onNext(UserInfo userInfo) {
                //请求成功
            }
        });

2重请求

 
  
 //登录,获取token
@GET("/login")
public Observable login(   
    @Query("username") String username,
    @Query("password") String password);
 //根据token获取用户信息
@GET("/user")
public Observable getUser(
    @Query("token") String token);
//..................................
service.login("11111", "22222")
    .flatMap(new Func1>() {  //得到token后获取用户信息
        @Override
        public Observable onNext(String token) {
            return service.getUser(token);
        })
    .subscribeOn(Schedulers.newThread())//请求在新的线程中执行请求
    .observeOn(Schedulers.io())         //请求完成后在io线程中执行
    .doOnNext(new Action1() {      //保存用户信息到本地
         @Override
         public void call(User userInfo) {
             saveUserInfo(userInfo);
         }
     })
    .observeOn(AndroidSchedulers.mainThread())//在主线程中执行
    .subscribe(new Observer() {
        @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,再通过那个func1函数把数据源从String转化成了User。

url的变化流程是:账号密码-》token

请求的流程是:给账号密码-》拿token-》给token-》拿User对象。

接下来就是这个组合框架的威力了,不需要你写多个rxjava2的订阅了,把你所有的操作封装成一次请求(只是看起来)。你只需要合理提供转化多个url就可以了。

你可能感兴趣的:(Android,Retrofit2,RxJava2,简单处理嵌套请求,flatMap)