[RxJava^Android]項目經驗分享 --- RxLifecycle功能實現分析(二)

  接着上一篇文章的內容,這篇文章一邊分析RxLifecycle的實現原理,一邊學習RxJava操做符。
首先RxLifecycle在基礎類裏定義BehaviorSubject並綁定Activity或Fragment的生命週期,生命週期被調用時BehaviorSubject就發射相應週期的數據。
而且BehaviorSubject同時做爲一個被觀察者,隨時被自定義的操做符觀察着。java

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傳入,定義的操做符根據生命週期數據進行變換。ide

@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的做用code

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。orm

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執行發射數據。
  
  
  原理分析到這裏但願可以帶來幫助。blog

相關文章
相關標籤/搜索