在RxJava2和first()函数中连接

时间:2017-04-19 12:43:47

标签: android rx-java rx-java2

我将我的存储库模式迁移到RxJava2。我的旧代码看起来像

@Override
public Observable<List<Post>> getPost() {
    return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
            .first(new Func1<List<Post>, Boolean>() {
                @Override
                public Boolean call(List<Post> posts) {
                    return posts != null;
                }
            });
}

但是,我不知道如何在RxJava2中替换它,如何用我当前的代码调用posts.upToDate()?

@Override
public Observable<List<Post>> getPost() {
    List<Post> list = new ArrayList<>();
    return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
            .first(list)
            .toObservable();
}

2 个答案:

答案 0 :(得分:2)

谢谢@PhoenixWang的提示。这是解决方案。

    @Override
public Observable<List<Post>> getPost() {
    return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
            .filter(new Predicate<List<Post>>() {
                @Override
                public boolean test(@NonNull List<Post> posts) throws Exception {
                    return isUpToDate(posts);
                }
            });
}

答案 1 :(得分:0)

您是否想要点击本地商店,如果本地商店中没有任何东西您只是尝试远程商店?我使用firstElement-operator来实现加载第一个,如果不可用则使用第二个源。我建议在观察者和错误处理上放置一个超时。如果第一个出现错误,则不会调用第二个。无需检查null,因为不允许使用空值。

让我们看看第一个测试&#39; name&#39 ;:两个observables生成每个List。 just1首先生成值,因此将使用它,just2中的值将被丢弃。

@Test
public void name() throws Exception {
    Observable<List<Integer>> just1 = Observable.just(Arrays.asList(1, 2, 3));
    Observable<List<Integer>> just2 = Observable.just(Arrays.asList(1, 2, 3));

    TestObserver<List<Integer>> await = Observable.concat(just1, just2)
            .firstElement().test().await();

    List<Integer> collect = await.values().stream()
            .flatMap(Collection::stream).collect(Collectors.toList());

    assertThat(collect).contains(1, 2, 3);
}

Test-2会将第二个值放入,因为just1只是在没有值的情况下完成。

@Test
public void name2() throws Exception {
    Observable<List<Integer>> just1 = Observable.empty();
    Observable<List<Integer>> just2 = Observable.just(Arrays.asList(1, 2, 3));

    TestObserver<List<Integer>> await = Observable.concat(just1, just2)
            .firstElement().test().await();

    List<Integer> collect = await.values().stream()
            .flatMap(Collection::stream).collect(Collectors.toList());

    assertThat(collect).contains(1, 2, 3);
}

Test-3不会发出任何值。订阅“可能&#39;你只会收到一份onComplete。

@Test
public void name3() throws Exception {
    Observable<List<Integer>> just1 = Observable.empty();
    Observable<List<Integer>> just2 = Observable.empty();

    TestObserver<List<Integer>> await = Observable.concat(just1, just2)
            .firstElement()
            .test()
            .await()
            .assertNoValues();
}

测试4不会发出任何值,因为在observables上传递了一个onError。

@Test
public void name4() throws Exception {
    Observable<List<Integer>> just1 = Observable.empty();
    Observable<List<Integer>> just2 = Observable.error(NoSuchElementException::new);

    TestObserver<List<Integer>> await = Observable.concat(just1, just2)
            .firstElement()
            .test()
            .await()
            .assertNoValues()
            .assertError(NoSuchElementException.class);
}