逆推分析RxLifeCycle的實現原理

直接上代碼,以下代碼爲根據RxLifeCycle的實現提取出的一個完整的上游數據源到下游數據源所經過的歷程
,註釋已經寫的差不多了

Ob
 .compose(new ObservableTransformer<Object, Object>() {
                            @Override
                            public ObservableSource<Object> apply(Observable<Object> upstream) {
                                //一個subject既是Observable又是Observer
                                Observable<ActivityEvent> activityEventObservable = OpenAccountActivity.this.provideLifecycleSubject()
                                        //Ob只會向最後訂閱的Ov發送事件,調用share即可以
                                        .share();

                                return upstream
                                        //takeUntil有兩種實現
                                        // 一種是:當返回true時,就發送onComplete
                                        // 另一種是:當(參數指定的)數據源發射事件時,發送onComplete
                                        //這裏採用第二種,同時藉助filter操作符(控制數據源發送的事件是否會被攔截),實現當到達對應生命週期時發送onComplete的效果
                                        .takeUntil(
                                                //每當聯合的數據源中,有數據源發送新的事件時,就會將所有的數據源發送的最新事件合併起來,發送一個新的事件
                                                //這裏利用這個特性,在每個生命週期方法的最後調用onNext發送生命週期事件
                                                Observable.combineLatest(
                                                        //將訂閱時的生命週期轉化爲停止發射事件的生命週期
                                                        activityEventObservable
                                                                .take(1)
                                                                .map(new Function<ActivityEvent, ActivityEvent>() {
                                                                    @Override
                                                                    public ActivityEvent apply(ActivityEvent activityEvent) throws Exception {
                                                                        return activityEvent;
                                                                    }
                                                                }),
                                                        //跳過訂閱時的生命週期,當後續生命週期發送
                                                        activityEventObservable
                                                                .skip(1),
                                                        new BiFunction<ActivityEvent, ActivityEvent, Boolean>() {
                                                            @Override
                                                            public Boolean apply(ActivityEvent bindUntilEvent, ActivityEvent lifecycleEvent) throws Exception {
                                                                return lifecycleEvent.equals(bindUntilEvent);
                                                            }
                                                        })
                                                        //是否攔截事件
                                                        .filter(b -> b));
                            }
                        })
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章