我有一个相当复杂的功能,我想反应性地实现。是否启用此功能取决于以下
Activity#onStart()
)。如果您不熟悉Android,这只意味着该视图对用户可见。以下是我已经拥有的以下观察结果。
Observable<Boolean>
- 用户是否启用此功能的首选项。如果已启用,则true
,如果已停用,则false
。 Observable<LifeCycleEvent>
- LifeCycleEvent
是一个与Android活动生命周期相关的枚举。
Observable<Void>
和Observable<Void>
,在订阅时,启动流程密集型任务以启用我的功能..这两个可观察对象需要
LifeCycleEvent#isStarted()
返回true
且#1发出true
(用户启用的功能)的事件时订阅LifeCycleEvent#isStarted()
返回false
LifeCycleEvent#isDestoryed()
返回true
的事件时取消订阅。我还需要取消订阅#1和#2,因为这意味着此类已准备好进行垃圾回收。false
时取消订阅(用户未启用此功能)我怎样才能做到最好?我有一个类将采用上面提到的依赖项和一个名为void startObserving()
的方法,它将关闭观察过程(并在此实例的生命周期内调用一次。我想我需要以某种方式维护两个订阅(一个用于#1&amp;#2,另一个用于#3)。
答案 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(....)