RxJava:如何制作一次获取并重用的 Observable?
RxJava: How do I make a fetch-once-and-reuse Observable?
每次启动应用程序时,我都有一个 Retrofit Observable 从服务器获取用户的用户名。我想为每个后续订阅者使用此值,但似乎每次我调用 subscribe() 时,都会从网络中重新获取该值。由于用户名在应用的生命周期内不太可能改变,我没有重新创建 Observable 对象,只实例化一次。
我希望它如何工作:
创建 Observable 一次
获取用户名一次,将该值保存在 Observable 中
在订阅时,使用保存的值,或者如果未完成提取,等待它被提取
我该怎么办?
您可以使用 cache()
,它将检索第一个订阅者的用户名,然后只向任何订阅者重播该值(当然包括第一个订阅者)。
为了详细说明 David 的正确答案,这里有一些代码说明了 cache
的用法:
public class Caching {
public static void main(String[] args) throws IOException {
Observable<String> observable = doSomethingExpensive().cache();
observable.subscribe(System.out::println);
observable.subscribe(System.out::println);
}
private static Observable<String> doSomethingExpensive(){
return Observable.create(subscriber -> {
System.out.println("Doing something expensive");
subscriber.onNext("A result");
subscriber.onCompleted();
});
}
}
请注意,即使您获得两次结果,您也只会做一次昂贵的事情。
每次启动应用程序时,我都有一个 Retrofit Observable 从服务器获取用户的用户名。我想为每个后续订阅者使用此值,但似乎每次我调用 subscribe() 时,都会从网络中重新获取该值。由于用户名在应用的生命周期内不太可能改变,我没有重新创建 Observable 对象,只实例化一次。
我希望它如何工作:
创建 Observable 一次
获取用户名一次,将该值保存在 Observable 中
在订阅时,使用保存的值,或者如果未完成提取,等待它被提取
我该怎么办?
您可以使用 cache()
,它将检索第一个订阅者的用户名,然后只向任何订阅者重播该值(当然包括第一个订阅者)。
为了详细说明 David 的正确答案,这里有一些代码说明了 cache
的用法:
public class Caching {
public static void main(String[] args) throws IOException {
Observable<String> observable = doSomethingExpensive().cache();
observable.subscribe(System.out::println);
observable.subscribe(System.out::println);
}
private static Observable<String> doSomethingExpensive(){
return Observable.create(subscriber -> {
System.out.println("Doing something expensive");
subscriber.onNext("A result");
subscriber.onCompleted();
});
}
}
请注意,即使您获得两次结果,您也只会做一次昂贵的事情。