gpt4 book ai didi

android - 当第一个 Observable 为空时 RxJava concat

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:27 24 4
gpt4 key购买 nike

我有一个本地存储库和一个从中获取数据的远程存储库。我第一次想从远程存储库中获取数据,然后将其缓存并从本地数据库中获取。我正在使用 2 个 Observables 和 concat 方法来执行此操作:

Observable.concat(localWeatherForecast, remoteWeatherForecast)
.filter(weatherForecasts -> !weatherForecasts.isEmpty())
.first();

对于本地可观察对象,我使用这个:

private Observable<List<WeatherForecast>> getAndCacheLocalWeather() {
return mLocalDataSource.getWeather()
.flatMap(new Func1<List<WeatherForecast>, Observable<List<WeatherForecast>>>() {
@Override
public Observable<List<WeatherForecast>> call(List<WeatherForecast> weatherEntries) {
return Observable.from(weatherEntries)
.doOnNext(entry -> mCachedWeather.add(entry))
.toList();
}
});
}

对于远程:

return mRemoteDataSource.getWeather()
.flatMap(new Func1<List<WeatherForecast>, Observable<List<WeatherForecast>>>() {
@Override
public Observable<List<WeatherForecast>> call(List<WeatherForecast> weather) {
return Observable.from(weather).doOnNext(entry -> {
mLocalDataSource.saveWeatherEntry(entry);
mCachedWeather.add(entry);
}).toList();
}
})
.doOnCompleted(() -> mCacheIsDirty = false);

这是订阅

Subscription subscription = mRepository
.getWeather()
.subscribeOn(mSchedulerProvider.computation())
.observeOn(mSchedulerProvider.ui())
.subscribe(
// onNext
this::processWeather,
// onError
throwable -> mWeatherView.showLoadingTasksError(),
// onCompleted
() -> mWeatherView.setLoadingIndicator(false));

即使本地存储库为空,concat 似乎也不会移动到第二个可观察对象(远程对象)。如果我颠倒顺序,那么它就可以工作(远程成为 concat 中的第一个)。我试图删除过滤器方法/first(),但即使如此,也不会处理远程可观察对象。

有什么想法吗?谢谢!

最佳答案

您可以为第一个可观察对象提供超时。如果第一个 observable 永远不会完成,它就不会切换到第二个。请看看我提供的测试方法:

测试方法“never_false”不会产生任何值并在 1000 毫秒后超时,因为没有值被推送。

对于方法“never_true”,concat 中的第一个可观察对象将在一段时间后超时,并将切换到 onComplete 可观察对象。因此,concat 将切换到第二个可观察对象并从该流中获取第一个元素。

@Test
public void never_false() throws Exception {
Observable<List<Integer>> never = Observable.never();

Observable<List<Integer>> just = Observable.just(Arrays.asList(1, 2, 3));
Observable<List<Integer>> concat = Observable.concat(never, just);

boolean await = concat.firstElement().test().await(1000, TimeUnit.MILLISECONDS);

assertThat(await).isTrue();
}

@Test
public void never_true() throws Exception {
Observable<List<Integer>> never = Observable.<List<Integer>>never()
.timeout(50, TimeUnit.MILLISECONDS)
.onErrorResumeNext(Observable.empty());

Observable<List<Integer>> just = Observable.just(Arrays.asList(1, 2, 3));

TestObserver<List<Integer>> test = Observable.concat(never, just)
.test()
.await()
.assertComplete()
.assertNoErrors();

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

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

关于android - 当第一个 Observable 为空时 RxJava concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com