如何在每次观察到订阅时运行函数

时间:2018-07-25 16:04:03

标签: 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) }

问题:如何在观察对象订阅之前运行函数?

3 个答案:

答案 0 :(得分:0)

要考虑的一个选项是使用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框架注入的,它将更好地工作。有效地,它允许您在API调用中作为附加步骤将映射到本地存储,而无需明确引用它。

要看的另一件事是对OkHttp(链接here)的缓存,它可能更适合您的用例。

答案 1 :(得分:0)

如果我对问题的理解正确,那么您想在订阅活动之前先做点事。在这种情况下,只需使用map运算符即可完成工作。 看起来像这样:

myRetrofit.create(MyInterface::class.java)
.map{
//operation, you can access the response as "it"
it
}.hitEndpoint()

答案 2 :(得分:0)

根据@akarnokd的评论,我只使用了.doOnNext { }

其他解决方案也可以使用,但这是最简单的。

相关问题