如何创建一个可观察的序列,其中部分序列可以取消订阅并重新订阅?

时间:2016-09-27 21:22:33

标签: android rx-java

我有一个相当复杂的功能,我想反应性地实现。是否启用此功能取决于以下

  1. 已启用此功能的用户首选项(用户可以启用或停用此功能)
  2. 活动已开始(Activity#onStart())。如果您不熟悉Android,这只意味着该视图对用户可见。
  3. 以下是我已经拥有的以下观察结果。

    1. Observable<Boolean> - 用户是否启用此功能的首选项。如果已启用,则true,如果已停用,则false
    2. Observable<LifeCycleEvent> - LifeCycleEvent是一个与Android活动生命周期相关的枚举。

    3. Observable<Void>Observable<Void>,在订阅时,启动流程密集型任务以启用我的功能..这两个可观察对象需要

      • 在#2发出LifeCycleEvent#isStarted()返回true且#1发出true(用户启用的功能)的事件时订阅
      • 取消订阅,当#2发出LifeCycleEvent#isStarted()返回false
      • 的事件时
      • 在#2发出LifeCycleEvent#isDestoryed()返回true的事件时取消订阅。我还需要取消订阅#1和#2,因为这意味着此类已准备好进行垃圾回收。
      • 从#1发出false时取消订阅(用户未启用此功能)
    4. 我怎样才能做到最好?我有一个类将采用上面提到的依赖项和一个名为void startObserving()的方法,它将关闭观察过程(并在此实例的生命周期内调用一次。我想我需要以某种方式维护两个订阅(一个用于#1&amp;#2,另一个用于#3)。

1 个答案:

答案 0 :(得分:2)

噢,我认为这是一个益智游戏:

Observable<Boolean> featureEnabled = ...;
Observable<LivecycleEvent> lifecycle = ...
   .filter(event -> event.isStarted() !=null || event.isDestroyed());
Observable<Void> processA = ...;
Observable<Void> processB = ...;

Observable<Void> processes = Observable.merge(processA, processB);

Observable.combineLatest(featureEnabled, lifecycle, (feature, event) ->
       Pair.of(feature && event.isStarted(), event.isDestroyed()))
   .takeUntil(pair -> pair.getRight())
   .map(Pair::getLeft)
   .debounceUntilChanged()
   .switchMap(flag -> flag ? processes : Observable.empty())
   .subscribe(....)