我将我的存储库模式迁移到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();
}
答案 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);
}