RxJava,副作用和返回void的方法



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

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

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

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

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

我的存储库 API 的编写方式我想做一些类似调用 repository.deleteData(( 的事情,但是我想在主线程之外执行此操作。解决这个问题的一种方法是放弃 RxJava,只创建一个线程来执行任务。这将起作用,但我使用 RxJava 做其他所有事情,所以我也想在这里使用它。

我找到了 2 个潜在的解决方案,但不确定它们的正确性如何:

1( 使用Observable.just(null)启动一个可观察量,然后使用doOnNext()副作用方法来调用我的仓库的方法。这似乎很笨拙,但它让我使用 RxJava 并让我指定要订阅/观察的线程,这使得线程化变得容易,并允许存储库的 API 保持不变,以便它仍然返回 void。

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

RxJava 有没有办法创建一个可观察量,它调用具有 void 返回类型的方法,该方法在副作用方法之外运行同步代码?

那么,为什么不这样呢?

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

现在,您可以通过onSubscribe执行所需的线程跳跃,并将所有内容保留在Rx中。

最新更新