我们在这里说的生命周期表示从被观察者发送事件开始到观察者收到事件的整个过程,它主要包含以下流程:
被观察者可以发送一个或者多个事件,观察者都会收到被观察者发送的事件。事件可以是正常事件,也可以是异常事件或者结束事件。
RxJava在生命周期的每个阶段都提供了相应的回调方法,我们可以借助这些回调方法做一些事件处理相关的事情,本章回中将介绍RxJava的生命周期以及相关的回调方法。
在事件流中加入相应的回调方法,这些回调方法的名称就是在原来方法的前面加上do,因此很好识别。当事件走到生命周期中的某个阶段时就会回调相应的方法。
比如发送事件使用的是onNext
()方法,接收事件使用的是onComplete
()方法,与这两个方法对应的生命周期方法是doOnNext
()和doOnComplete
()方法。
我觉得RxJava
的生命周期类似Activity的生命周期,大家可以通过对比的方式来掌握这方面的知识。接下来我们通过文字结合代码的方式来介绍生命周期相关的知识。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<String> emitter) throws Throwable {
Log.d(TAG, "subscribe: ");
Log.d(TAG, "send event at subscribe");
emitter.onNext("Event 1");
Log.d(TAG, "send complete at subscribe");
emitter.onComplete();
}
}).doOnNext(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.d(TAG, "doOnNext accept: ");
}
}).doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Throwable {
Log.d(TAG, "doOnSubscribe accept: ");
}
}).doOnComplete(new Action() {
@Override
public void run() throws Throwable {
Log.d(TAG, "doOnComplete accept: ");
}
}).doOnTerminate(new Action() {
@Override
public void run() throws Throwable {
Log.d(TAG, "doOnTerminate run: ");
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
Log.d(TAG, "onSubscribe: ");
}
@Override
public void onNext(@io.reactivex.rxjava3.annotations.NonNull String s) {
Log.d(TAG, "onNext: ");
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
});
在上面的代码中我们先是创建了被观察者和观察者。在被观察者中发送一个正常事件和一个结束事件,然后在事件流中使用doOnXXX
生命周期回调方法。我们在每个方法中都添加了日志,编译并且运行上面的程序可以得到以下结果:
D/rxjava: doOnSubscribe accept:
D/rxjava: onSubscribe:
D/rxjava: subscribe:
D/rxjava: send event at subscribe
D/rxjava: doOnNext accept:
D/rxjava: onNext:
D/rxjava: send complete at subscribe
D/rxjava: doOnComplete accept:
D/rxjava: doOnTerminate run:
D/rxjava: onComplete:
从上面的程序运行结果中可以看到doOnXXX这些生命周期回调方法伴随着事件的流动而流动,回调方法的运行时间位于被观察者发送事件后,观察者收到事件前。所以我们在程序中可以监听这些回调方法,通过回调方法来捕获事件流中的事件。
比如被观察者使用onComplete
()方法发出了结束事件,doOnComplete
()这个生命周期方法就被调用,最后是观察者中的onComplete
()方法被调用。这个流程只有一个例外:订阅方法,先是生命周期方法doOnSubscribe
()方法被调用,接着是观察者的onSubscribe
()方法被调用,最后才是被观察者的Subscribe
()方法被调用。
有看官觉得生命周期相关方法没有用处,其实它的用处比较多,比如just
()操作符发出事件是通过参数自动发送的,不像create
()操作符需要手动发送事件,如果想在发送事件时对事件做一些处理,这是办不到的,怎么办?我们可以在事件发出后,观察者收到事件前通过生命周期的doOnNext
()方法捕获事件并且处理事件。
还有一个使用的地方是timer
。timer相关的操作符发送事件是自动的,而且发送的是固定事件,我们可以通过生命周期方法从事件流中拦截事件,做一些与事件相关的事情。
看官们,关于"RxJava中的生命周期"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!