【发布时间】:2017-08-08 21:05:57
【问题描述】:
我已经使用 RxJava 编写了一个存储库,但在找出处理对存储库的写入和删除的最佳方法时遇到了麻烦。
在写这篇文章时,我的目标是确保任何 write 或 delete 方法都能够从 RxJava 副作用方法中调用。这意味着 write / delete 方法必须同步运行并且不返回 Observable。这样我可以做这样的事情:
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 有没有办法创建一个 Observable,它调用一个返回类型为 void 的方法,该方法在副作用方法之外运行同步代码?
【问题讨论】:
-
这个link 可以帮助你。考虑 rxjava 和 rxjava2 的区别,我认为你的第一个解决方案是常见用法。
-
所以你想从你的同步方法构造 Observables?
标签: rx-java