RxJava,副作用和返回void

时间:2017-08-08 21:05:57

标签: rx-java

我使用RxJava编写了一个存储库,但我无法找到处理repo写入和删除的最佳方法。

写这篇文章时,我的目标是确保能够从RxJava副作用方法调用任何写入或删除方法。这意味着写/删除方法必须同步运行并且不返回Observable。这样我可以做这样的事情:

repository
    .fetchData()
    .doOnNext(s -> if (s.equals("something") {
                       repository.writeData(s);
                   }
    )
    .subscribe();

这是一个简单的例子,但是它表明我调用了一个返回Observable的存储库方法,订阅了Observable,当Observable的onNext()方法被调用时,我可以执行我的副作用,即同步写入内存缓存或数据库。

好的,这个示例效果很好,但现在我遇到了一个问题,我只需要从内存缓存或数据库中写入或删除数据。也就是说,我想使用RxJava来运行同步代码,其中方法返回void。

我的Repository的API编写方式我想做一些像调用repository.deleteData()的东西,但是我想在主线程上执行此操作。解决这个问题的一种方法是抛弃RxJava并创建一个线程来执行任务。这可行,但我用RxJava做其他所有事情,所以我也想在这里使用它。

我找到了2个可能的解决方案但不确定它们有多正确:

1)使用Observable.just(null)启动一个observable,然后使用doOnNext()副作用方法调用我的存储库方法。这看起来很糟糕但它让我使用RxJava并让我指定要在/观察的线程,这使线程变得容易,并允许存储库的API保持不变,以便它仍然返回void。

2)我也可以做Observable.defer()之类的事情,然后从延迟的调用方法我可以返回Observable.just(repository.deleteData())。如果我这样做,我必须更改存储库的API,以便deleteData方法具有Void返回类型而不是void(并且该方法还添加了return null;以实现方法签名的合同)。这也允许我使用RxJava,指定我想要观察和订阅的线程并继续使用Observable,即使我真正做的是副作用。

RxJava是否有办法创建一个Observable,它调用一个带有void返回类型的方法,该方法在副作用方法之外运行同步代码?

1 个答案:

答案 0 :(得分:0)

那么,为什么不这样呢?

public static <T> Observable<T> observeCompletion(Runnable r) {
   return Observable.defer(() -> {
         r.run();
         return Observable.empty();
   };
}

现在你可以通过onSubscribe进行所需的线程跳转,并将所有内容保存在Rx中。