RxJava 可观察为 class 字段

RxJava observable as class field

假设我们有一个 rxjava observable 作为 class 字段:

public class MyClass {

    private final Observable<Integer> myObservable = Observable.just(1);

    public Observable<Integer> getMyObservable() {
        return myObservable;
    }
}

在这种情况下,只有一个 observable 实例共享给 class 个客户端。

当总是返回一个新的可观察实例时,性能影响如何:

public class MyClass{

    public Observable<Integer> getMyObservable() {
        return Observable.just(1);
    }
}

我问是因为在我的代码库中,我有很多在方法调用时创建和返回的可观察对象。 我想知道创建 class 个实例然后返回是否是个好主意?

我认为在性能方面没有太大区别。无论如何,我在第一个实现中看到了一个问题:我认为你不会总是使用 1 作为要从 Observable 发出的项目。可能,确实,你想要这样的东西:

public class MyClass {

    private int value = 100;

    private final Observable<Integer> myObservable = Observable.just(value);

    public Observable<Integer> getMyObservable() {
        return myObservable;
    }
}

我的意思是,我希望发出 class 的参数,就像示例中那样。

问题在于发出的值将始终为 100,而不管变量将采用的下一个值如何。让我们看一个例子:

MyClass mc = new MyClass();
mc.getMyObservable().subscribe(value -> print(value));
mc.setValue(200);
mc.getMyObservable().subscribe(value -> print(value));

您希望打印 100 和 200,但您得到的是双倍的 100。这是因为当您将 Observable.just(value) 分配给变量 myObservable 时,您正在固定值将始终发出。

为了防止这种情况,您可以使用 defer 运算符:

private final Observable<Integer> myObservable = Observable.defer(() -> Observable.just(value));

现在,Observable 发出的项将是订阅时变量的值。

注意:您可以使用 fromCallable 运算符获得相同的结果:

private final Observable<Integer> myObservable = Observable.fromCallable(() -> value);