接着上一篇文章的內容,這篇文章一邊分析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執行發射數據。
原理分析到這里希望能夠帶來幫助。