我最近才开始使用 Rx,所以如果这不是我想做的事情的最佳方法,请更正它。
目标:拥有一个可观察到的 API(使用 Retrofit),并且每次执行都会将响应保存到本地存储,但不必每次订阅它时都执行此操作,因为我会在多个位置执行此操作。
有这样的东西:
myRetrofit.create(MyInterface::class.java).hitEndpoint()
我想做这样的事情:
myRetrofit.create(MyInterface::class.java).hitEndpoint()
.intercept { storageUtils.saveItem("key", it) }
问题:如何在订阅 observable 之前运行函数?
最佳答案
要考虑的一个选择是使用 ObservableTransformer<T>
。
解决方案的草图如下所示:
class LocalStorageComposer<T>: ObservableTransformer<T,T>(private val localStorage : LocalStorage) {
override fun apply(upstream: Observable<T>) {
return upstream.map {
localStorage.store(it)
it
}
}
}
然后你像这样使用它:
someApi.getAllData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(LocalStorageComposer(localStorage))
.subscribe //etc
如果 LocalStorageComposer
效果会更好是您可以使用 Dagger 2 等 DI 框架注入(inject)的东西。实际上,它允许您将映射到本地存储作为 API 调用中的额外步骤,而无需显式引用它。
另一件需要注意的事情是 OkHttp 的缓存(链接 here ),它可能更适合您的用例。
关于java - 如何在每次订阅可观察值时运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51523314/