如何解决可观察到存储了最后一个值,但不能推送新值?
假设我有一个Person
界面,其中有一个name
可观察的页面:
interface Person {
Observable<String> name;
}
它的实现:
class David implements Person {
Observable<String> name = BehaviorSubject<>.createDefault("David");
}
现在有一个问题,因为我无法观察到name
的当前值:
class Main {
public static void main(String[] args) {
Person person = PersonFactory.create();
System.out.println(??person.name.currentValue??);
}
}
我不想在界面中将名称公开为BehaviorSubject,因为那样每个人都可以更改名称,这不是我想要的。
我有点了解Observables的逻辑,所以我知道它们并不是为了存储任何值而设计的。那么,RxJava中的“具有当前值的不可变的可观察对象”是什么?
在Android中,有LiveData
和mutablelivedata
。据我了解,mutablelivedata
等同于BehaviorSubject
,那么RxJava中LiveData
等同于什么?
解决方法
将变量name
的类型定义为David
内部的主题,并使用hide()
方法公开为可观察对象。使用hide可以确保外界不会调用onNext
,即更改名称。 See the docs for hide() here
class David implements Person {
private PublishSubject<String> nameSubject = BehaviorSubject<>.createDefault("David");
public Observable<String> observeName() {
return nameSubject.hide();
}
// If you want the outside world to update the name
public void setName(String name) {
nameSubject.onNext(name)
}
}
,
我已经决定使用字段委派创建自己的LiveData
interface LiveData<out T> {
val observable: Observable<out T>
val value: T
fun subscribe(onNext: Consumer<in T>): Disposable = observable.subscribe(onNext)
}
class MutableLiveData<T>(initial: T) : LiveData<T> {
private val subject: BehaviorSubject<T> = BehaviorSubject.createDefault(initial)
override val observable: Observable<out T> = subject
override var value: T
get() = subject.value
set(value) = subject.onNext(value)
fun mutate(mutationFunction: T.() -> Unit) {
value.mutationFunction()
value = value
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。