Rxjava - 逻辑隔离

时间:2017-06-16 19:08:21

标签: android rx-java

基本上,我想检查我的数据库中是否有数据,如果我没有,请拨打api电话。我使用此逻辑向API发出请求:

 private void requestDataToApi() {
        mSubscribe = createRequest()
                .delay(DELAY_SPLASH_SCREEN_SECONDS, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(categoryModels -> {
                    writeDataToDb(categoryModels);

                }, (throwable -> {
                    dealError();
                }));
    }

这个逻辑验证是否存储了任何数据:

if (mRealm.where(CategoryModel.class).findAll().size() == 0) {
      requestDataToApi();
    } else {
      getView().openMainActivity(readDataFromDb());
    }

有什么方法可以加入这两种逻辑吗?基本上,如果需要,可以使用dispose验证数据库并进行调用吗?

3 个答案:

答案 0 :(得分:3)

您可以使用filter和switchIfEmpty运算符

@Test
public void ifEmpty() throws InterruptedException {
    Observable.just(getDataFromDatabase())
            .filter(value -> !value.isEmpty())
            .switchIfEmpty(Observable.just("No data in database so I go shopping"))
            .subscribe(System.out::println);
}

private String getDataFromDatabase() {
    if(new Random().nextBoolean()){
        return "data";
    }
    return "";
}

您可以在https://github.com/politrons/reactive

了解更多来自被动世界的信息

答案 1 :(得分:1)

您似乎需要Repository Pattern

这种模式将业务逻辑与数据源隔离开来。因此,您只需要提供数据,而不关心这些数据的来源。所以你可能会有类似的东西:

session.send('Message with URL: https://botframework.com');

因此,您可以从业务层(或者在您的情况下,视图层)加载数据,以确保它已存储在本地。

不要忘记在必要时使用public class CategoryModelRepo { public Observable<CategoryModel> getAll() { return Observable.defer(() -> { List<CategoryModel> fromRealm = mRealm.where(CategoryModel.class).findAll(); if (fromRealm.size() == 0) { return requestDataToApi() .onNext(dataList -> storeDataInRealm(dataList)) } else { return Observable.just(fromRealm); } } } // This code fragment could be improved by applying a DAO pattern // http://www.oracle.com/technetwork/java/dataaccessobject-138824.html private Observable<CategoryModel> requestDataToApi() { return createRequest() .delay(DELAY_SPLASH_SCREEN_SECONDS, TimeUnit.SECONDS) } .subscribeOn(...)

答案 2 :(得分:0)

如果您愿意为项目添加一个依赖项,Store是一个非常好的解决方案。否则,我建议使用Repository模式中的概念。