我正在使用RxJava2构建Android MVVM应用程序。我想要的是在我的ViewModel中公开Observable
,我也可以接收最后发出的值(如BehaviourSubject
)。我不想公开BehaviourSubject
,因为我不希望视图能够拨打onNext()
。
例如,在我的ViewModel
中,我公开了一个日期。我现在想要订阅TextView
更改,但如果我想显示DatePickerDialog
此日期作为初始值,我还需要能够访问当前值。
实现这一目标的最佳方式是什么?
答案 0 :(得分:1)
根据定义,我不想公开
BehaviourSubject
Subject
“Observer
和Observable
同时”。因此,不是公开BehaviorSubject
本身只是暴露Observable
,因此客户端(在这种情况下是视图)将无法执行onNext()
,但将能够接收最后发出的值
作为主题方法的替代方法,您可以使用replay(1).autoConnect()
方法。请参阅Kaushik Gopal在"RxJava by example" presentation中有关此方法的更多详细信息。
另外,请考虑cache()
运算符(请参阅cache
和replay().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);
}
}