rxjava - 使用concat无法正常运行的观察者缓存

时间:2015-07-10 02:54:20

标签: rx-java observable netflix rx-android

关注tutorial 我想我会创建一个假的内存,磁盘,网络对象,如果一个失败,就会看到订单。我的目标是根据文章评论看看是否有人失败了concat移动到下一个:

  

这种模式的关键是concat()只在需要时订阅每个子Observable。如果数据被缓存,则没有不必要的查询较慢的源,因为first()将提前停止序列。换句话说,如果内存返回结果,那么我们就不会打扰去磁盘或网络。相反,如果内存和磁盘都没有数据,它就会发出新的网络请求。

然后我创建了以下测试:

 Data disk=new Data();
    disk.setAddress("38 Oriole");
    disk.setPostalCode("mc72l9");
    disk.setDate("feb 12");

Data network=new Data();
network.setAddress("39 skyway");
network.setPostalCode("mt82l9");
network.setDate("feb 13");


Observable observerMemory = Observable.create(new Observable.OnSubscribe<String>() {

            @Override
            public void call(final Subscriber subscriber) {
                subscriber.onNext(null);
            }}
);


Observable<Data> observerDisk = Observable.from(disk);
Observable<Data> observerNetwork = Observable.from(network);

Observable.concat(observerMemory, observerDisk, observerNetwork).first().subscribe(new Subscriber<Data>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {
        System.out.println("****" + e);
    }

    @Override
    public void onNext(Data data) {
        System.out.println(data.toString());
    }
});

但是,在运行此测试时,我希望它能够打印磁盘可观察(流)。所以输出应该是38 Oriole等,因为第一个observable返回null,如果一个我想的失败,concat应该得到下一个流。我的意思是根据文章,如果一个流失败,如内存流,那么concat应该转到下一个磁盘流。但对我来说,它没有这样的事情。发射在第一个零错误处停止。我究竟做错了什么。我正在做这个假测试,以确保这种方式有效,然后我继续使用反应式编程创建一个真正的缓存系统。

顺便说一句,这里使用的是rxjava依赖:

compile 'com.netflix.rxjava:rxjava-android:0.20.7'

1 个答案:

答案 0 :(得分:4)

问题是observerMemory在订阅时调用onNext(null)。为了让concat继续前进到下一个Observable,需要完成observerMemory。如果将subscriber.onNext(null)替换为subscriber.onComplete(),则第一个发出的项目将来自磁盘。