在项目里运行RxAndroid - 第二天

继续我的rx之路

引用方法

在你的app下的gradle里添加如下引用

compile 'io.reactivex:rxandroid:1.1.0'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
compile 'io.reactivex:rxjava:1.1.0'

我的项目使用Retrofit作为网络框架,所以还需要引入Retrofit

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'

Retrofit提供了与RxJava无缝衔接的接口,所以笔者非常庆幸当初选择了它作为网络基础框架。关于Retrofit的使用这里就不细说了,以后有机会希望我也能补上一篇自己的使用心得。

接口的写法

在retrofit2.0当中接口方法有了返回值,想使用RxJava仅仅修改返回值为Observable就可以。

@FormUrlEncoded 
@POST(API_PHP_APP_API) 
Observable<Result<User>> login(@FieldMap Map<String, Object> params);

如此就完成了接口的改造。实际使用时代码的书写规则就发生了神奇变化!

UserRequest.loginCall("username", "password")
        .subscribeOn(Schedulers.io())  // 使用io线程处理请求
        .observeOn(AndroidSchedulers.mainThread()) // 使用主线程处理下面的结果
        .subscribe(new Observer<Result<User>>() {
          @Override public void onCompleted() {
            
          }
          @Override public void onError(Throwable e) {
            // 登录失败
          }
          @Override public void onNext(Result<User> userResult) {
            // 服务器返回登录成功,你可以直接操作返回的json数据已经转化完成的user对象
            // 例如显示登陆的用户名tvUname.setText(user.username)
          }
        });

多个异步请求顺序完成

上面的例子只是单一的请求处理,实际上你用okhttp的call代码会更简洁。我的项目里遇到的问题是有多个请求必须按顺序依次执行。只需要在上面的代码基础上稍微做点修改。

操作符 map和flatMap

map可不是数据结构那个map,也不是地图!map是RxJava的操作符之一,他的作用是接收上一个observer的数据并生产一个新的observer传递下去。有点像吃掉了一棵树的苹果,然后用种子种出另外一棵树给下一个人吃,当然他的生长速度是一瞬间。

添加操作符

既然是承接上一个的结果,所以写在后面

UserRequest.registCall(phone, varify, password, invite)//注册
        .observeOn(Schedulers.io())
        .flatMap(new Func1<Result<User>, Observable<Result<User>>>() {//登陆
          @Override public Observable<Result<User>> call(Result<User> userResult) {
            return UserRequest.loginCall(phone, password);
          }
        })
        ...// 按需要加任意个操作符
        .flatMap(new Func1<Observable<User>, Observable<Result>>() {
          @Override public Observable<Result> call(Observable<User> userObservable) {
            return UserRequest.setLevelCall(2);
          }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<Result>() {
          @Override public void onCompleted() {
          }
          @Override public void onError(Throwable e) {
              // 错误处理,中间有一个请求出现错误都会终止
          }
          @Override public void onNext(Result result) {
            // 成功
          }
        });

稍加处理后整个代码的思维清晰度将是一目了然。这里就不再献丑了。

总结

到这里就完成了RxJava的引入体验。现在只是这里一处有这样的需求,如果长时间使用米发现大问题就打算大规模的优化改造。写这个文章一方面记录下自己的心得,一方面也希望能帮助想快速入门又不想阅读长篇大论的朋友。我自己也很讨厌啰嗦的文字,身为程序员其实最好的交流语言就是代码。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。