在项目里运行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 国际许可协议 进行许可。