我有一个相当复杂的特性,我想要被动地实现。是否启用此功能取决于以下
- 此功能的用户首选项已启用(用户可以打开或关闭此功能)
- 活动启动(
Activity#onStart()
)。如果你不熟悉Android,这只是意味着视图对用户是可见的。
以下是我已有的可观察对象。
-
Observable<Boolean>
—是否启用此功能的用户首选项。 启用 Observable<LifeCycleEvent>
-LifeCycleEvent
是一个enum,与Android的activity生命周期有关。Observable<Void>
和Observable<Void>
,当订阅时,启动一个进程密集型任务来启用我的特性。这两个可观测值必须为- 订阅,当#2发出一个事件,
LifeCycleEvent#isStarted()
返回true
, #1发出true
(用户启用的功能) - 取消订阅,当#2发出一个事件,
LifeCycleEvent#isStarted()
返回false
当#2发出 - 取消订阅。我还需要取消订阅#1和#2,因为这意味着这个类已经准备好进行垃圾收集了。
- 当#1发出
false
时取消订阅(用户未启用此功能)
LifeCycleEvent#isDestoryed()
返回true
的事件时- 订阅,当#2发出一个事件,
true
,禁用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(....)