RxJava是什么
RxJava是由ReactiveX开发并维护的一个开源项目。一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。有点抽象,这句话说白了就是观察者模式、异步、事件流。RxJava是一种响应式编程。
RxJava怎么用
Retrofit 2.0中加入了CallAdapter机制,官方已经准备好了几个CallAdapter module,其中最著名的module可能是为RxJava准备的CallAdapter
,它能将请求结果作为Observable
返回,而不是默认的Call
对象。
- 添加依赖:
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'io.reactivex:rxjava:1.1.3'
compile 'io.reactivex:rxandroid:1.1.0'
- Retrofit Builder链表中加入
RxJavaCallAdapterFactory
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
- 定义HTTP的API对应的接口,将返回Call改为返回Observable:
public interface MyService {
@FormUrlEncoded //表单方式传递键值对
@POST("user/login")
Observable<UserInfo> login(
@Field("username") String username,
@Field("password") String password
);
}
相比之前的接口文件,这里login()方法的返回值是不在是Call类型而是Observable类型。
- 使用Observable完成一个网络请求,登录成功后保存数据到本地
MyService service = retrofit.create(MyService.class);
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) {
//请求成功
}
});
}
RxJava + Retrofit 形式的时候,Retrofit 把请求封装进 Observable ,在请求结束后调用 onNext() 或在请求失败后调用 onError()。相比之前,我们需要提供一个 Adapter,将 OkHttpCall 转换为 Observable ——RxJavaCallAdapterFactory。
可以看到,调用了service的login方法后得到Observable对象,在新的线程中执行网络请求,请求成功后切换到io线程执行保存用户信息的动作,最后再切换到主线程执行请求失败onError()、请求成功onNext()。整体的逻辑十分清晰都在一条链中,就算还有别的要求还可以往里面添加,丝毫不影响代码的简洁。