zoukankan      html  css  js  c++  java
  • [RxJava^Android]项目经验分享 --- RxLifecycle功能实现分析(二)

      接着上一篇文章的内容,这篇文章一边分析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执行发射数据。
      
      
      原理分析到这里希望能够带来帮助。

  • 相关阅读:
    Codefoces Gym 101652 【最大连续和】
    HYSBZ 4034 【树链剖分】+【线段树 】
    Codeforces Gym 101291C【优先队列】
    Codeforces gym 101291 M (最长交替子序列)【DP】
    HDU 3308 LCIS (经典区间合并)【线段树】
    POJ 3237 Tree (树链剖分+边权转点权)
    POJ 2763 Housewife Wind (树链剖分+边权转点权)
    P1054 等价表达式
    P1107 [BJWC2008]雷涛的小猫
    P1552 [APIO2012]派遣
  • 原文地址:https://www.cnblogs.com/assassin-l/p/5436034.html
Copyright © 2011-2022 走看看