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()