2014-06-26 13 views
6

RxJava'yı ve Android'e uygulanabilirliğini araştırıyorum ve aşağıdaki ASCII'de gösterildiği gibi basit bir önbellek gösterimli kullanım durumu uygulamaya çalışıyorum grafik: bir arka plan iş parçacığı üzerinde gerçekleştirilen ve verileri görüntülemeye UI iş parçacığı üzerinde olur edilir beklenen, ağ ve önbelleğe alma gibiRxJava Android - Düz dişlilerle ilgili, yükleme-önbellekli gösterim verileri

subscription = AndroidObservable.bindFragment(this, restClient.getItems()) 
       .onErrorReturn(new Func1<Throwable, List<Item>>() { 
        @Override public List<Item> call(Throwable throwable) { 
         return itemsDao.getCachedItems(); 
        } 
       }) 
       .flatMap(new Func1<ItemContainer, Observable<Item>>() { 
        @Override public Observable<Item> call(ItemContainer itemContainer) { 
         return Observable.from(itemContainer.getItems()); 
        } 
       }) 
       .filter(new Func1<Item, Boolean>() { 
        @Override public Boolean call(Item item) { 
         return item.getName().startsWith("B"); 
        } 
       }) 
       .toList() 
       .map(new Func1<List<Item>, List<Item>>() { 
        @Override public List<Item> call(List<Item> items) { 
         itemsDao.cacheItems(items); 
         return items; 
        } 
       }) 
       .subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<List<Item>>() { 
        @Override public void call(List<Item> items) { 
         displayData(items); 
        } 
       }); 

:

    --------------- 
     --- failure --| Load data |-- success --- 
     |    ---------------    | 
     V           V 
-------------------      ------------- 
| Get from cache |      | Filter | 
-------------------      ------------- 
     |           | 
     |           V 
     |   ----------------  ------------- 
     ------------>| Display |<------| Cache | 
        ----------------  ------------- 

Burada başlangıçta ile geldi kod. Sorun, onErrorReturn() tarafından döndürülen verilerin, gereksiz olan aynı filtreleme ve önbellek döngüsünden geçmesidir. Bunun için kodunu değiştirmek Ancak,:

subscription = AndroidObservable.bindFragment(this, restClient.getItems()) 
        .flatMap(new Func1<ItemContainer, Observable<Item>>() { 
         @Override public Observable<Item> call(ItemContainer itemContainer) { 
          return Observable.from(itemContainer.getItems()); 
         } 
        }) 
        .filter(new Func1<Item, Boolean>() { 
         @Override public Boolean call(Item item) { 
          return item.getName().startsWith("B"); 
         } 
        }) 
        .toList() 
        .map(new Func1<List<Item>, List<Item>>() { 
         @Override public List<Item> call(List<Item> items) { 
          itemsDao.cacheItems(items); 
          return items; 
         } 
        }) 
        .onErrorReturn(new Func1<Throwable, List<Item>>() { 
         @Override public List<Item> call(Throwable throwable) { 
          return itemsDao.getCachedItems(); 
         } 
        }) 
        .subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Action1<List<Item>>() { 
         @Override public void call(List<Item> items) { 
          displayData(items); 
         } 
        }); 

displayData()

asla denir. Sahip olduğum şemayı uygulamak için bu gözlenebilirleri oluşturmanın doğru yolu ne olurdu?

cevap

5

onErrorReturn() değiştirilerek çözüldü onErrorResumeNext(Observable.just(itemsDao.getCachedItems()))