java - 如何在每次订阅可观察值时运行函数

标签 java android kotlin rx-java

我最近才开始使用 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/

相关文章:

java - 字符串 : replace pattern with formatted number

java - File.delete() 错误异常

java - getSupportActionBar().setDisplayHomeAsUpEnabled(true);抛出空指针异常

android - 无法使用 lambda 找到数据绑定(bind)事件的方法

java - 我们可以将特定字母保留在顶部并按字母顺序排列吗?

java - 使用 Oracle 的 Spring Boot 应用程序 - ORA-01000 : maximum open cursors exceeded - error happening during load testing

java - 使用 incanter 从 clojure 中的数组获取均值和协方差矩阵

android - fragment 无法转换为 android.app.activity

java - 在 RecyclerView 中使用 RecyclerView.OnScrollListener 实现加载更多项得到重复项

java - 为什么在 Kotlin 类中实现 Cloneable 接口(interface)会导致 "error: no interface expected here"?