RxJava:如何等待以前的订阅初始化值?

时间:2016-11-27 21:03:46

标签: android rx-java

我有一个初始化为网络调用的类变量。

类似getter的方法负责在初始化时返回值,或等待如果网络调用尚未返回则要初始化的值。

如何使用RxJava实现这一点?

另一个解决方案是,我可以简单地创建一个新的网络调用,而不是等待,而不是初始化值,如下所示:

private String value;

public Observable<String> getValue() {
    if (value != null) {
        return Observable.just(value);
    }

    return getValueRemotely();
}

private Observable<String> getValueRemotely() {
    ...
}

但我想避免多次网络通话。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

这实际上是AsyncSubject的一个很好的用例。

private AsyncSubject<String> value = AsyncSubject.create();

public Observable<String> getValue() {
    value.asObservable();
}

getValueRemotely()中,您必须确保onNext()onComplete()value的来电。

value.onNext(valueString);
value.onCommpleted();

AsyncSubject只有import Quick import Nimble class SomeSpec: QuickSpec { override func spec() { describe("bad test") { it("does not pass") { expect("good").to(equal("bad")) } } } } 只能在完成时发出一个项目。

答案 1 :(得分:0)

TL; DR - 将您的变量包装成Observable:

Observable<String> value = Observable
    .defer(() -> Observable.just(getValueRemotely()))
    .cacheWithInitialCapacity(1);

...然后使用它:

value.subscribe(v -> /*use value received from net*/);

背景:RxJava是基于回调的。所以,当你想从你的observable中得到一些东西时,你不要说'return observable.get()' - 相反,你提供的回调将接收observable的内容。也许。实际上,当有内容时。

需要一些心理上的努力来围绕这个概念。使用RxJava,您很少输入'return'关键字,而是传递回调。起初这可能会让人觉得奇怪,但在某些情况下,回调优于“返回”。

例如,您可以要求某个组件通知您某些事件。在普通的Java中,你可能不得不在一些锁上阻塞你的线程。或者你可以推迟发送网络请求,直到真正需要响应:出现需要的时刻是回调准备接受响应的那一刻。