2015-07-10 118 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