[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

相关文章
相关标签/搜索