2017-10-20 36 views
0

即時使用BehaviourourRelay作爲源observable,我喜歡它會發出訂閱時最後緩存的值,所以我不需要手動調用showPlayingState(mPlayStateManager.getCurrentState())。如何知道可觀察的發射是否是緩存的BehaviourSubject值?

但是這會帶來一個問題,當我想在訂閱中對動畫做出反應時,因爲我不想在這個緩存的發射中運行動畫,當我在onCreate中訂閱時,它會被命中,UI應該跳轉到沒有動畫的狀態到它。動畫應該只運行在一個「新鮮」的情況下發出

這是一個相當普遍的用例ATLEAST我,但有麻煩林在RX

class Activity { 

    PlayStateManager mPlayStateManager; 
    Button mButton; 

    void onCreate(SavedinstanceState state) { 
     mPlayStateManager.playState() 
     .subscribe(state -> { 
      switch(state) { 
      case PlayState.PLAYING: 
       showPlayingState(true, ???); 
       break; 
      case PlayState.PAUSED: 
       showPlayingState(false, ???); 
       break; 
      } 
     } 
    } 

    void showPlayingState(boolean isPlay, boolean animate) { 
    if(!animate) { 
     mButton.setText(isPlay ? "Playing" : "Paused"); 
    } else { 
     mButton.animate() 
      .rotate(360) 
      .onAnimationEnd(() -> { 
       mButton.setText(isPlay ? "Playing" : "Paused"); 
      }) 
     } 
    } 
} 


class PlayStateManager { 

    BehaviourRelay<PlayState> mSubject = new BehaviourRelay(); 

    public void set(PlayState state) { 
     mSubject.accept(state); 
    } 

    public Observable<PlayState> playState() { 
     return mSubject.hide(); 
    } 
} 

回答

0

想出來的。如果我正確地理解你的問題,如果playState()是較舊的信息,但只有在切換狀態時纔會執行動畫。換句話說,在onCreate()的初始調用中,您不想執行動畫,但如果值發生更改,則需要執行動畫。

enum PlayStateExpanded { 
    UNKNOWN, 
    PLAYING, 
    PAUSED 
} 

class PlayStateManager { 

    BehaviourRelay<PlayStateExpanded> mSubject = 
     new BehaviourRelay(PlayStateExpanded.UNKNOWN); 

    public void set(PlayState state) { 
     mSubject.accept(
      state == PlayState.PLAYING ? PlayStateExpanded.PLAYING 
             : PlayStateExpanded.PAUSED); 
    } 

    public Observable<PlayStateExpanded> playState() { 
     return mSubject.hide(); 
    } 
} 

void onCreate(SavedinstanceState state) { 
    AtomicBoolean firstTime = new AtomicBoolean(true); // note first time 
    mPlayStateManager.playState() 
    .subscribe(state -> { 
     switch(state) { 
     case PlayStateExpanded.PLAYING: 
      showPlayingState(true, firstTime.get()); 
      break; 
     case PlayStateExpanded.PAUSED: 
      showPlayingState(true, firstTime.get()); 
      break; 
     } 
     firstTime.set(false); // no longer first time 
    } 
} 

所謂具有UNKNOWN值重新定義播放狀態,開機狀態下被簡化。只需在第一次使用後添加第一次轉換標誌即可完成您陳述的目標。

+0

是的,但主題可以開始空,沒有緩存的值 – urSus

+0

而且?你的問題沒有描述這種情況下的行爲。代碼顯示您等待要定義的值。 –

+0

你是什麼意思? behaviourrelay沒有初始默認值,可能是空的,那麼在訂閱時,這些隊伍不會被緩存,並且第一個「新鮮」排放將被錯誤地對待。順便說一句,這取決於它的行爲繼續,你不應該知道的事實,因此hide(),有沒有我的方式,我可以編碼它發射的數據呢? – urSus

相關問題