RxJava Observable在订阅时发出最新值

时间:2018-03-22 12:22:31

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  

我不想公开BehaviourSubject

根据定义,

Subject ObserverObservable同时”。因此,不是公开BehaviorSubject本身只是暴露Observable,因此客户端(在这种情况下是视图)将无法执行onNext(),但将能够接收最后发出的值

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

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

答案 1 :(得分: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);
    }
}