【问题标题】:RxJava Observable that emits latest value upon subscription订阅时发出最新值的 RxJava Observable
【发布时间】:2018-03-22 22:23:38
【问题描述】:

我正在使用 RxJava2 构建一个 Android MVVM 应用程序。我想要的是在我的 ViewModel 中公开一个Observable,我还可以接收最后一个发出的值(如BehaviourSubject)。我不想公开BehaviourSubject,因为我不希望视图能够调用onNext()

例如,在我的ViewModel 中,我公开了一个日期。我现在想订阅 TextView 以进行更改,但如果我想显示 DatePickerDialog 并以该日期作为初始值,我还需要能够访问当前值。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: java android rx-java reactive-programming rx-java2


    【解决方案1】:

    代表:

    class TimeSource {
        final BehaviorSubject<Long> lastTime = BehaviorSubject.createDefault(
            System.currentTimeMillis());
    
        public Observable<Long> timeAsObservable() {
            return lastTime;
        }
    
        public Long getLastTime() {
            return lastTime.getValue();
        }
    
        /** internal only */
        void updateTime(Long newTime) {
            lastTime.onNext(newTime);
        }
    }
    

    【讨论】:

    • 顺便说一下,要隐藏 lastTime 的发布能力,你会想用 "return lastTime.hide()" 更新 timeAsObservable() 这样,只有 observable 暴露在外面。跨度>
    【解决方案2】:

    我不想暴露BehaviourSubject

    Subject,根据定义,“同时是一个Observer 和一个Observable。因此,与其公开BehaviorSubject 本身,不如公开Observable,因此客户端(在本例中为视图)将无法执行onNext(),但将能够接收最后发出的值。

    作为主题方法的替代方法,您可以使用replay(1).autoConnect() 方法。在 Kaushik Gopal 的 "RxJava by example" presentation 中查看有关此方法的更多详细信息。

    另外,请考虑cache() 运算符(请参阅cachereplay().autoConnect() here 的区别)。

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      相关资源
      最近更新 更多