2017-05-31 78 views
1

這是在Kotlin,但我認爲任何編寫Java的人都能理解。用RxJava重複對狀態的操作

我想用Rx製作一個秒錶,我在做實際的停止和啓動時遇到了一些麻煩。最大的問題是我不知道如何保持當前的時間,而修改它作爲不同的動作(開始和停止)進來。這就是我現在所擁有的。

fullTime.switchMap { startTime -> 
    controlCommands.switchMap { command -> 
     when (command) { 
      ControlState.PLAY -> Observable.interval(1L, TimeUnit.SECONDS).map { 
       ControlState.PLAY 
      } 
      ControlState.PAUSE -> Observable.just(ControlState.PAUSE) 
      else -> Observable.just(ControlState.STOP) 
     } 
    } 
} 

fullTimecontrolCommandsObservable s表示發出關於當前起始時間來算,從下來,說分別下一步要做什麼,活動。我想鏈接controlCommands並能夠保持狀態從startTime開始,當PLAY事件出現時將倒計時,當出現PAUSE時暫停,當出現STOP時重置爲startTime

scan幾乎可以工作,但我不知道如何在計時器點擊0後停止,並且PLAY仍然每秒發送一次,因爲它會發送重複信息。它也不允許狀態和觀察值之間的分離。因此,我積累的值scan必須與Observable內的值相同(如果有意義的話)。

任何想法我應該做什麼?

回答

-1

如果我理解正確,就說明您的行程正確scan。你只需要

  • 一個.takeUntil(state -> state.hasCompleted)停止,當你需要停止(OW也許takeWhile,這取決於)。
  • 然後.map(state -> state.getValute())來獲取值

這是否有道理?

+0

是否會導致訂閱完成,還是會在新的命令/時間到來時繼續? – mrobinson7627

+0

'.takeUntil'將導致訂閱終止 - 當條件滿足時,它將從父母取消訂閱。 –

+0

所以這並不是我想要的,因爲我想繼續觀察'fullTime'和'controlCommands'。 – mrobinson7627