作用:
首先说一下RX.JAVA的作用,其实它就是处理异步操作的,类似于 AsyncTask和Handler
原理:
是一种基于扩展的观察者模式:被观察者 (Observable) ——>产生事件 顾客
观察者(Observe) ——>接受事件,并给出响应动作 厨房
订阅(Subscribe) ——>连接被观察者和观察者 服务员
事件(Event) ——>被观察者&观察者沟通的载体 菜式
也就是说,被观察者(Obeservable) 通过 订阅(Subscribe) 按顺序发送事件 给观察者(Observe),观察者(Observe) 按顺序接收事件 & 做出对应的响应动作
现在正式开始使用:
步骤1:创建被观察者(Observable) &产生事件
//1、创建被观察者(Observable)对象
Observable observable = Observable.create(new ObservableOnSubscribe() {
/**
* create() 是RXJava最基本的创造事件序列的方法
* 此处传入了一个OnSubscribe对象参数
* 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
* 即观察者Observer会依次调用对应事件的重写方法从而响应事件
* 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
* 2、在复写的subscribe()里定义需要发送的事件
* */
@Override
public void subscribe(ObservableEmitter e) throws Exception {
/*
* 通过ObservableEmitter类对象产生事件并通知观察者
* Observable类介绍
* a.定义:事件发射器
* b.作用:定义需要发送的事件 & 向观察者发送事件
* */
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
/*
* 扩展:RXJava 提供了其他方法用于创建被观察者对象Observable
* 方法1:just(T..)直接将传入的参数依次发送出来
* */
Observable observable1 = Observable.just("A","B","C");
//将会依次调用:
步骤2:创建观察者(Observer) & 并定义响应事件的行为
//1、创建被观察者(Observable)对象
Observable observable = Observable.create(new ObservableOnSubscribe() {
/**
* create() 是RXJava最基本的创造事件序列的方法
* 此处传入了一个OnSubscribe对象参数
* 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
* 即观察者Observer会依次调用对应事件的重写方法从而响应事件
* 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
* 2、在复写的subscribe()里定义需要发送的事件
* */
@Override
public void subscribe(ObservableEmitter e) throws Exception {
/*
* 通过ObservableEmitter类对象产生事件并通知观察者
* Observable类介绍
* a.定义:事件发射器
* b.作用:定义需要发送的事件 & 向观察者发送事件
* */
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
/*
* 扩展:RXJava 提供了其他方法用于创建被观察者对象Observable
* 方法1:just(T..)直接将传入的参数依次发送出来
* */
Observable observable1 = Observable.just("A","B","C");
//将会依次调用:
//步骤2、创建观察者Observer 并定义响应事件行为 ,相当于开厨房,确定对应菜式
Observer observer = new Observer() {
//通过复写对应方法来响应被观察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG,"开始采用subscribe链接");
}
@Override
public void onNext(Integer value) {
Log.d(TAG,"对Next事件"+value+"作出响应");
}
@Override
public void onError(Throwable e) {
Log.d(TAG,"对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG,"对Complete事件作出响应");
}
};
// 步骤3:通过订阅(Subcribe) 连接观察者和被观察者
observable.subscribe(observer);
我们也可以用另一种方式:基于事件流的链式调用方式
/**
*使用RXJava事件流链式调用
**/
Observable.create(new ObservableOnSubscribe() {
/**
* create() 是RXJava最基本的创造事件序列的方法
* 此处传入了一个OnSubscribe对象参数
* 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
* 即观察者Observer会依次调用对应事件的重写方法从而响应事件
* 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
* 2、在复写的subscribe()里定义需要发送的事件
* */
@Override
public void subscribe(ObservableEmitter e) throws Exception {
/*
* 通过ObservableEmitter类对象产生事件并通知观察者
* Observable类介绍
* a.定义:事件发射器
* b.作用:定义需要发送的事件 & 向观察者发送事件
* */
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
}).subscribe(new Observer() {
//通过复写对应方法来响应被观察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "开始采用subscribe链接");
}
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件" + value + "作出响应");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});
可以发现俩中方式的测试效果是相同的:
步骤3:当然观察者Observer的订阅方法subscribe还有几个重载方法的,一起来看看
// 表示观察者不对被观察者发送的事件作出任何响应(但被观察者还是可以继续发送事件)
public final Disposable subscribe() {}
// 表示观察者只对被观察者发送的Next事件作出响应
public final Disposable subscribe(Consumer super T> onNext) {}
// 表示观察者只对被观察者发送的Next事件 & Error事件作出响应
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError) {}
// 表示观察者只对被观察者发送的Next事件、Error事件 & Complete事件作出响应
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError, Action onComplete) {}
// 表示观察者只对被观察者发送的Next事件、Error事件 、Complete事件 & onSubscribe事件作出响应
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError, Action onComplete, Consumer super Disposable> onSubscribe) {}
// 表示观察者对被观察者发送的任何事件都作出响应
public final void subscribe(Observer super T> observer) {}
步骤4:我们也可以断开观察者(Observer) 与 被观察者(Observable)的联系,使用Disposable.dispose(),这样的话被观察者(Observable)还是可以继续发送事件的,只是观察者(Observer)接收不到
举个栗子:
注意:1、Disposable这个属性是用订阅的方法 OnSubscribe 中赋值过来的
2、当调用Disposable.dispose断掉被观察者(Observable) 和 观察者(Observer)联系之后,通过logcat可以明显看到观察者Observer收不到事件了。
RX.Java有一些快速创建被观察者(Observable)的方法,也就是说它说一些操作符可以帮助我们快速开发,比如创建被观察者--just的方法,可以看下列代码:
//1、创建被观察者(Observable)对象
/**
*使用RXJava事件流链式调用
**/
Observable.just(1,2,3,4).subscribe(new Observer() {
Disposable mDisposable;
//通过复写对应方法来响应被观察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "开始采用subscribe链接");
mDisposable = d;
}
@Override
public void onNext(Integer value) {
if (value == 2) {
mDisposable.dispose();
}
Log.d(TAG, "对Next事件" + value + "作出响应");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});
然后传入数组、集合什么的都可以: