微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可观察到存储了最后一个值,但不能推送新值?

如何解决可观察到存储了最后一个值,但不能推送新值?

假设我有一个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中,有LiveDatamutablelivedata。据我了解,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 举报,一经查实,本站将立刻删除。