2016-09-27 2 views
1

私は反応的に実装したいかなり複雑な機能を持っています。この機能を有効にするかどうかは、この機能のために、次の観測可能なシーケンスを作成するには、その一部を購読解除して再購読することができますか?

  1. ユーザー設定が有効になっているに依存します(ユーザーがオンまたはオフにこの機能を切り替えることができます)
  2. 活動は、(Activity#onStart())に開始されます。あなたがAndroidに精通していない場合、これは単にビューがユーザーに見えるということです。

私が既に持っている以下の観察可能なものがあります。

  1. Observable<Boolean> - この機能が有効になっているかどうかのユーザーの設定。有効な場合はtrue、無効の場合はfalseです。
  2. Observable<LifeCycleEvent> - LifeCycleEventは、Androidのアクティビティライフサイクルに関連する列挙型です。加入

  3. Observable<Void>Observable<Void>、私の機能を有効にするプロセス集約型のタスクをキックオフ。これら2つの観測は、#2は、LifeCycleEvent#isStarted()戻りtrueというイベントを発するときに加入

    • である必要があり、 #1〜#2が場合#2へのLifeCycleEvent#isStarted()戻りfalse
    • が解除イベントを発するときに解除
    • true
    • (ユーザイネーブル機能)を発しますLifeCycleEvent#isDestoryed()trueを返すというイベントが発生します。 #1と#2の登録を解除する必要があるのは、このクラスがガベージコレクションの準備が整っているからです。 #1はfalse発したときから解除

(ユーザーはこの機能を有効にしませんでした)私は最高これをどのように行うことができますか?私は上記の依存関係を取る単一のクラスと、void startObserving()と呼ばれる単一のメソッドを持っています。このプロセスは、このプロセスが終了するまでは一度だけ呼び出されます(私は何とか2つのサブスクリプションを維持する必要があります。#1 &#2、#3のための別)

答えて

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

絶対に華麗ありがとうございます、あなたは(distinctUntilChangedを意味します)。 – ZakTaccardi

関連する問題