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



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

  1. 此功能的用户首选项已启用(用户可以打开或关闭此功能)
  2. 活动启动(Activity#onStart())。如果你不熟悉Android,这只是意味着视图对用户是可见的。

以下是我已有的可观察对象。

  1. Observable<Boolean>—是否启用此功能的用户首选项。
  2. 启用true,禁用false
  3. Observable<LifeCycleEvent> - LifeCycleEvent是一个enum,与Android的activity生命周期有关。

  4. Observable<Void>Observable<Void>,当订阅时,启动一个进程密集型任务来启用我的特性。这两个可观测值必须为

    • 订阅,当#2发出一个事件,LifeCycleEvent#isStarted()返回true, #1发出true(用户启用的功能)
    • 取消订阅,当#2发出一个事件,LifeCycleEvent#isStarted()返回false
    • 当#2发出LifeCycleEvent#isDestoryed()返回true的事件时
    • 取消订阅。我还需要取消订阅#1和#2,因为这意味着这个类已经准备好进行垃圾收集了。
    • 当#1发出false时取消订阅(用户未启用此功能)

我怎样才能做到最好?我有一个类,它将接受上面提到的依赖关系,还有一个名为void startObserving()的方法,它将启动观察进程(并在该实例的生命周期内被调用一次)。我想我将需要以某种方式维持两个订阅(一个是#1 &;#2, #3)。

哦,这是一个难题,我想:

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(....)

相关内容

  • 没有找到相关文章

最新更新