RxJava:如何制作一次重读和重用的Observable?

时间:2015-04-24 14:41:20

标签: java android rx-java

在每个应用程序启动时,我都有一个Retrofit Observable,用于从服务器获取用户的用户名。我想为每个后续订阅者使用此值,但似乎每次调用subscribe()时,都会从网络中重新获取该值。由于用户名在应用程序的生命周期中不太可能发生变化,因此我不会重新创建Observable对象,只会实例化一次。

我希望它如何工作:

创建一次Observable

获取用户名一次,将该值保存在Observable

在订阅时,使用该保存的值,或者如果未完成提取,则等待提取

我应该怎么做?

2 个答案:

答案 0 :(得分:14)

详细说明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();
        });
    }
}

请注意,即使您获得两次结果,也只能做一次昂贵的事情。

答案 1 :(得分:5)

您可以使用cache()来检索第一个订阅者的用户名,然后将该值重播给任何订阅者(当然包括第一个订阅者)。