我有一个初始化为网络调用的类变量。
类似getter的方法负责在初始化时返回值,或等待如果网络调用尚未返回则要初始化的值。
如何使用RxJava实现这一点?
另一个解决方案是,我可以简单地创建一个新的网络调用,而不是等待,而不是初始化值,如下所示:
private String value;
public Observable<String> getValue() {
if (value != null) {
return Observable.just(value);
}
return getValueRemotely();
}
private Observable<String> getValueRemotely() {
...
}
但我想避免多次网络通话。
有什么想法吗?
答案 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中,你可能不得不在一些锁上阻塞你的线程。或者你可以推迟发送网络请求,直到真正需要响应:出现需要的时刻是回调准备接受响应的那一刻。