Rxjava是什么?
官方介绍:
RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM
// 翻译:RxJava 是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
总结: 是一个基于事件流和实现异步操作的库,类似于AsyncTask Handler的作用;
原理: 被观察者(Observable)通过订阅(Subscribe)按顺序发送事件(Event)给观察者(Observer),观察者按顺序接受事件并作出处理;
Rxjava基本使用一(同步)
基本使用(一) : 代码简洁 从上到下链式调用
//创建被观察者 Observable 对象 决定什么时候触发事件以及触发什么样的事件
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void onStart() {
//事件未发送之前调用 用于做一些准备工作,比如重置数据或者清零
super.onStart();
}
@Override
public void call(Subscriber<? super Integer> subscriber) {
//发送事件 相当于 onClick();
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
//事件队列完结,当不会有新的onNext,会触发此方法
subscriber.onCompleted();
}
}).subscribe(new Subscriber<Integer>() {
//创建被观察者对象
@Override
public void onCompleted() {
Log.i(TAG, "对Complete事件作出响应");
}
@Override
public void onError(Throwable e) {
//异常 同时会触发此方法 不允许再有事件发出
//onCompleted()和 onError()二者相互排斥 只能调用其一
Log.i(TAG, "对Error事件作出响应");
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "对Next事件"+ integer +"作出响应" );
}
});
打印日志
12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件1作出响应
12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件2作出响应
12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件3作出响应
12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Complete事件作出响应
基本使用(二) :
Observer<Integer> observer=new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
}
};
除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,他们的基本使用方式是完全一样的;
Rxjava的快速创建事件队列:
Observable observable = Observable.just(1, 2, 3);
创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来:
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
上面的方法实现的是同步的观察者模式;
Rxjava基本使用二(异步)
线程控制–Scheduler
Rxjava遵循的是线程不变的原则,哪里调用subscribe(),就在哪里生产事件; 那个线程生产事件,就在那个线程处理事件,如果是垮线程,就需要用到scheduler;(调度器也叫线程控制器);
- Schedulers.immediate(): 默认在当前线程执行;
- Schedulers.newThread(): 总是启动新的线程,在新线程中执行操作;
- Schedulers.io(): (读写文件,读写数据库.网络信息交互等)与newThread()的区别在于io()内部实现使用一个无数量上线的线程池组成,可以重用空闲的线程,所以在一般情况下比newThread()更有效;
- Schedulers.computation(): 计算所使用的,这个计算是的是CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算;
- AndroidSchedulers.mainThread(): 安卓专用的主线程;
通过 subscribeOn() 指定事件产生的线程或者所发生的线程;observeOn() 指定事件消费的线程或者所运行的线程;如下代码所示:
Observable.just(1, 2, 3, 4)
// 指定 subscribe() 发生在 IO 线程
.subscribeOn(Schedulers.io())
// 指定 Subscriber 的回调发生在主线程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});
以上代码的格式几乎算是非常常见,[ 后台线程取数据,前台线程显示 ];