android如何使用 switchIfEmpty RxJava

标签: Java Android
发布时间: 2016/10/10 20:59:28
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这里的逻辑是,如果在数据库中的评级是空的然后我想让他们从 API。我有以下代码︰

Observable.from(settingsRatingRepository.getRatingsFromDB())
            .toList()
            .switchIfEmpty(settingsRatingRepository.getSettingsRatingModulesFromAPI())
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);

getRatingsFromDB()调用返回 List<SettingRating> ,但 API 调用返回 Observable<List<SettingRating>>

然而,当我单元测试这一点,当我从数据库调用传递一个空的列表,它不执行 API 调用。有人可以帮我在这件事。这是我的单元测试代码︰

when(mockSettingsRatingsRepository.getRatingsFromDB()).thenReturn(Collections.emptyList());
List<SettingsRating> settingsRatings = MockContentHelper.letRepositoryReturnSettingsRatingsFromApi(mockSettingsRatingsRepository);

settingsParentalPresenter.onViewLoad(false);

verify(mockView).loadRatingLevels(settingsRatings, false);

解决方法 1:

它是 @Kiskae 提到,事实上我都迷惑与一个空列表为空 Observable 。因此,我用以下的是自己想要的什么︰

public void onViewLoad(boolean hideLocks) {
    Observable.just(settingsRatingRepository.getRatingsFromDB())
            .flatMap(settingsRatings -> {
                if (settingsRatings.isEmpty()) {
                    return settingsRatingRepository.getSettingsRatingModules();
                } else {
                    return Observable.just(settingsRatings);
                }
            })
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);
}
赞助商