Rxjava我们可以把他理解成一个河流,事件的起点我们称为上游,事件的终点我们称为下游,河里面的水都是从上而下流动,所以Rxjava也一样,只能从事件的起源再到事件的处理,不可逆状态,我们如果想要改变事件只能在上游和下游之间对事件进行拦截.
上游: 被观察者(Observable)
下游: 观察者(Observer)
示例代码
public void rx01(View view) {
//Rxjava的起点 被观察 上游
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
Log.e(TAG, "上游开始发射事件 1" );
e.onNext("1");
Log.e(TAG, "上游发射事件 完成 " );
}
}).subscribe(//订阅,让被观察和观察者产生关联
//Rxjava的终点 观察者 下游
new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.e(TAG, "订阅成功");
}
@Override
public void onNext(String s) {
Log.e(TAG, "下游接收处理事件 onNext " + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
输出:
订阅成功
上游开始发射事件 1
下游接收处理事件 onNext 1
上游发射事件 完成
经过多次测试总结:
结论一: 顺序: 先是下游和上游订阅成功的onSubscribe,然后是上游的发射事件subscribe,
如果上游戏先有onNext那么下游就会接收到onNext事件.
结论二: 如果上游先发射onComplete,再发射onError时,会出现闪崩现象,Rxjava不允许这样
结论三: 如果上游先发射onError,再发射onComplete时,下游会走onError但是不会走onComplete
结论四 如果上游发射了onComplete或者onError事件,那么他以后的onNext都不会触发到下游的onNext事件
结论五 切断下游,如果我的的Activity销毁了这时个就要切断下游接收事件,dispose()