接着上一篇文章的内容,这篇文章一边分析RxLifecycle的实现原理,一边学习RxJava操作符。
首先RxLifecycle在基础类里定义BehaviorSubject并绑定Activity或Fragment的生命周期,生命周期被调用时BehaviorSubject就发射相应周期的数据。
并且BehaviorSubject同时作为一个被观察者,随时被自定义的操作符观察着。
private final BehaviorSubject<ActivityEvent> lifecycleSubject
= BehaviorSubject.create();
@Override
@CallSuper
protected void onStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
protected void onStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
再来看看基础类里如何提供定义的变换符,RxLifecycle提供的bindActivity方法将BehaviorSubjec传入,定义的操作符根据生命周期数据进行变换。
@Override
@NonNull
@CheckResult
public final <T> Observable.Transformer<T, T> bindToLifecycle() {
return RxLifecycle.bindActivity(lifecycleSubject);
}
把核心变换操作的代码贴上,边分析思路边熟悉了解几个陌生的操作符。
这里几个关键的操作应用实现了,绑定生命周期的变化。
takeUntil
TakeUntil 订阅并开始反射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知,TakeUtil返回的Observable会停止反射原始Observable并终止。源码使用这个操作判断是否执行发射原始Observable。
代码理解一下takeUntil的作用
Observable.just(1).takeUntil(Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
//subscriber.onNext("abc"); //如果不发射"abc",Log信息回接收到onNext=1;
}
})).subscribe(Utils.getSubscriber());
04-26 18:19:59.886 15714-15714/qulei.rxjava.demo D/RxJava: onNext : 1
04-26 18:19:59.886 15714-15714/qulei.rxjava.demo D/RxJava: onCompleted
combineLatest
当两个Observables中的任何一个发射了数据时,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据。这里根据BehaviorSubject生命周期的变化作为判断是否发射数据终止原始它还监视你提供的第二个Observable。
Observable.combineLatest(
sharedLifecycle.take(1).map(correspondingEvents),sharedLifecycle.skip(1),
new Func2<R, R, Boolean>() {
@Override
public Boolean call(R bindUntilEvent, R lifecycleEvent) {
return lifecycleEvent.equals(bindUntilEvent);
}
})
takeFirst
如果原始Observable没有发射任何满足条件的数据,takeFist 会返回一个空的Observable(不调用 onNext() 但是会调用 onCompleted )。如果生命周期不是绑定的周期,将继续匹配下一个周期时间,如果相同就发送空的Observable,停止原始的Observable执行发射数据。
原理分析到这里希望能够带来帮助。