在执行Observable.merge(o1, o2)
时,是否有办法获得明显的结果?
我实际上正在使用这段代码:
public Observable<List<GalleryItem>> getData(int page) {
return network(page).publish(network -> Observable.merge(network, cache().takeUntil(network))).onErrorResumeNext(cache());
}
network()
方法用作远程数据源,它将项目列表保存到Room DAO并在之后返回。
cache()
方法只是从数据库中检索列表。
private Observable<List<GalleryItem>> network(int page) {
return service
.getItems(page)
.flatMap(new MapGalleryResponseToPosts(true))
.doOnNext(galleryItems -> {
mTopDao.nukeTable();
mTopDao.saveImages(galleryItems);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io());
}
private Observable<List<GalleryItem>> cache() {
return Observable.fromCallable(mTopDao::loadImages).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
它做它应该做的事情,在网络呼叫之前显示缓存,当网络呼叫执行它时基本上复制(某些)项目。
我尝试使用distinct()
,但显然它不起作用。
我还生成了hashCode和equals(),因为我读到distinct()
取决于它。
答案 0 :(得分:0)
为 GalleryItem 对象生成equals
和hashcode
。 Distinct()
运算符将按预期工作。请尝试以下代码..
public Observable<List<GalleryItem>> getData(int page) {
return Observable.merge(network(page), cache()).distinct()).onErrorResumeNext(cache());
}
检查distinct()
运算符
Observable<Integer> values1 = Observable.create(o -> {
o.onNext(1);
o.onNext(1);
o.onNext(2);
o.onNext(3);
o.onNext(2);
o.onComplete();
});
Observable<Integer> values2 = Observable.create(o -> {
o.onNext(1);
o.onNext(1);
o.onNext(1);
o.onNext(2);
o.onNext(3);
o.onNext(8);
o.onNext(9);
o.onNext(10);
o.onComplete();
});
Observable.merge(values1, values2).distinct().subscribe(
v -> System.out.println(v),
e -> System.out.println("Error: " + e),
() -> System.out.println("Completed")
);
使用distinct()
和distinct()
运算符检查结果。
希望这会对你有所帮助。