2017-10-20 32 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

相关问题