合并observable后的Distinct()方法

时间:2018-01-19 20:18:17

标签: android rx-java rx-java2 rx-android reactivex

在执行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()取决于它。

1 个答案:

答案 0 :(得分:0)

GalleryItem 对象生成equalshashcodeDistinct()运算符将按预期工作。请尝试以下代码..

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()运算符检查结果。

希望这会对你有所帮助。