添加依賴java
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.1' implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1'
在rxlifecycle依賴包下游以下幾個關鍵類android
在rxlifecycle-android-lifecycle依賴包下有以下幾個關鍵類app
不直接使用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))