2015-07-10 111 views
0

继此tutorial 我想我会创建一个虚假的内存,磁盘,网络对象,看看那里的顺序,如果一个失败。我的目标是根据文章评论看看是否有人失败它转移到下一个:rxjava - 从concat使用concat不起作用的高速缓存

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

i,那么创建了以下测试:

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奥利奥尔等等,因为第一个观测值返回null,如果我认为失败,concat应该得到下一个流。我的意思是根据文章,如果一个流失败,如内存流,然后concat应该去到下一个流是磁盘。但对我而言,它没有这样的事情。排放停止在null的第一个误差。我究竟做错了什么。我正在做这个假测试,以确保这种方式工作之前,我继续使用反应式编程一个真正的缓存系统。

这里的方法是使用rxjava依赖IM:

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

回答

3

的问题是,observerMemory呼吁onNext(空)时认购。要使concat转到下一个Observable,需要完成observerMemory。如果用subscriber.onComplete()代替subscriber.onNext(null),则第一个发射的物品将从磁盘发出。

+0

优秀。现在它按预期工作,我明白了为什么我们使用first()。谢谢 。 – j2emanue