RxJava定义:
RxJava 是一个用于实现异步操作的库。
RxJava可以视为异步,其核心为 Observables(被观察者) 和 Observable(观察者)。Observables可以发出一系列的事件,事件执行结束后交给Observable 的回调处理。
RxJava2 的观察者模式
观察者模式是对象的行为模式,也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
采用观察者模式可以避免去轮询检查,节约有限的cpu资源。
RxJava 作为一个工具库,使用的便是通用形式的观察者模式:
普通事件:onNext(),相当于 onClick()、onEvent();特殊事件:onCompleted() 和 onError()
如图所示,RxJava 的基本概念分别为:
1.Observable(被观察者,事件源)
2.Observer(观察者,订阅者)
3.subscribe (订阅)
4.事件
RxJava 把多个事件看做一个队列,并对每个事件单独处理。 onCompleted() 表示请求成功完成任务没有出现错误 onError() 表示请求失败终止请求
2.RxJava2 响应式编程结构
响应式编程的组成为Observable/Operator/Subscriber,RxJava在响应式编程中的基本流程如下:
这个流程,可以简单的理解为:Observable -> Operator1 -> Operator2 -> Operator3 -> Subscriber
-
Observable发出一系列事件,他是事件的产生者;
-
Subscriber负责处理事件,他是事件的消费者;
-
Operator是对Observable发出的事件进行修改和变换; 若事件从产生到消费不需要其他处理,则可以省略掉中间的Operator,从而流程变为Obsevable -> Subscriber;
-
Subscriber通常在主线程执行,所以原则上不要去处理太多的事务,而这些复杂的处理则交给Operator;
RxJava + Retrofit完成网络请求
1、添加依赖。前四个分别是RxJava、RxAndroid、Retrofit以及Gson的库,最后那个才是新加入的,RxJava + Retrofit的使用需要用到最后那个包。
compile 'io.reactivex:rxjava:2.0.4'
compile 'io.reactivex:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
2、写一个登录的service
public interface Service {
@GET("user/login" )
Observable<UserInfo> login(
@Query("username") String username,
@Query("password") String password
);
}
3、使用Observable完成一个网络请求,登录成功后保存数据到本地。
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
MyService service = retrofit.create(MyService.class);
service.login(phone, password)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.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) {
}
});