RxLifecycle筆記

添加依賴java

implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
    implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1'

在rxlifecycle依賴包下游以下幾個關鍵類android

  • RxLifecycle
  • LifecycleProvider
  • LifecycleTransformaer

在rxlifecycle-android-lifecycle依賴包下有以下幾個關鍵類app

  • AndroidLifecycle
  • RxLifecycleAndroidLifecycle

不直接使用RxLifecycle,而是使用AndroidLifecycle.ide

如何建立AndroidLifecycle.this

//AndroidLifecycle.java
LifecycleProvider<Lifecycle.Event> provider = AndroidLifecycle.createLifecycleProvider(this);

AndroidLifecycle實現了android.arch.lifecycle.LifecycleObserver.能夠經過註解@OnLifecycleEvent來監聽對應的Lifecycle.Event.code

@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onEvent(LifecycleOwner owner, Lifecycle.Event event) {
    //向下遊傳遞
        lifecycleSubject.onNext(event);
        if (event == Lifecycle.Event.ON_DESTROY) {
        //解除觀察者
            owner.getLifecycle().removeObserver(this);
        }
    }

這裏的lifecycleSubject是一個BehaviorSubject對象.既能夠做爲觀察者,也能夠做爲被觀察對象使用.當監聽到對應的Lifecycle.Event時,就會經過lifecycleSubject.onNext(event);向下遊傳遞.orm

AndroidLifecycle中定義了兩個綁定相關的方法.經過這兩個綁定方法,將lifecycleSubject與下游鏈接起來,才能確保lifecycleSubject攜帶的信息能傳遞給下游.server

/**
    * 綁定某個具體的生命週期環節
    *  event具體爲
    *   ON_CREATE
    *   ON_START
    *   ON_RESUME
    *   ON_PAUSE
    *   ON_STOP
    *   ON_DESTROY
    *   ON_ANY
    */
    public <T> LifecycleTransformer<T> bindUntilEvent(@NonNull Lifecycle.Event event) {
        return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
    }

    /**
    * 綁定到生命週期
    */
    public <T> LifecycleTransformer<T> bindToLifecycle() {
        return RxLifecycleAndroidLifecycle.bindLifecycle(lifecycleSubject);
    }

第一個方法使用到了RxLifecycle.bindUntilEvent方法.對象

public static <T, R> LifecycleTransformer<T> bindUntilEvent(@Nonnull final Observable<R> lifecycle,
                                                              @Nonnull final R event) {
      checkNotNull(lifecycle, "lifecycle == null");
      checkNotNull(event, "event == null");
      return bind(takeUntilEvent(lifecycle, event));
  }

這裏的takeUntilEvent方法是判斷lifecycle所攜帶的event是否與參數event一致.bind方法源碼以下:生命週期

public static <T, R> LifecycleTransformer<T> bind(@Nonnull final Observable<R> lifecycle) {
        return new LifecycleTransformer<>(lifecycle);
    }

建立了一個LifecycleTransformer對象.

public final class LifecycleTransformer<T> implements ObservableTransformer<T, T>,
                                                      FlowableTransformer<T, T>,
                                                      SingleTransformer<T, T>,
                                                      MaybeTransformer<T, T>,
                                                      CompletableTransformer{
    final Observable<?> observable;

    LifecycleTransformer(Observable<?> observable) {
        checkNotNull(observable, "observable == null");
        this.observable = observable;
    }

    @Override
    public ObservableSource<T> apply(Observable<T> upstream) {
        return upstream.takeUntil(observable);
    }

    @Override
    public Publisher<T> apply(Flowable<T> upstream) {
        return upstream.takeUntil(observable.toFlowable(BackpressureStrategy.LATEST));
    }

    @Override
    public SingleSource<T> apply(Single<T> upstream) {
        return upstream.takeUntil(observable.firstOrError());
    }

    @Override
    public MaybeSource<T> apply(Maybe<T> upstream) {
        return upstream.takeUntil(observable.firstElement());
    }

    @Override
    public CompletableSource apply(Completable upstream) {
        return Completable.ambArray(upstream, observable.flatMapCompletable(Functions.CANCEL_COMPLETABLE));
    }

                                                      }

先說一下takeUntil操做符的做用.

ObservableA.takeUntil(ObservableB);

ObservableB開始發射數據,ObservableA中止發射數據.
那麼對於LifecycleTransformer,當observable開始發射數據,
upstream就會中止發射數據.這裏的observable就是AndroidLifecycle中的BehaviorSubject.而upstream就是咱們本身的數據源.

LifecycleTransformer經過與RxJava2的操做符compose結合使用.

val lifecycleProvider = AndroidLifecycle.createLifecycleProvider(this)

observable.compose(lifecycleProvider.bindUntilEvent(Lifecycle.Event.ON_DESTROY))
相關文章
相關標籤/搜索