首页 > 解决方案 > RxJava:如何从不同的函数中提取相同的 observeOn?

问题描述

基本上我的 Android 应用程序有一些元数据需要在不同情况下报告给后端服务器:

data class SearchMetaData(
    val searchId: String?,
    val isRateLimit: Boolean
)

为了使代码干净,我将最小的情况如下。所有的报表逻辑都是类似的,每个函数subscribe都是元数据提供者并获取需要报表的值。

fun logEvent1() {
    fetchMetaData().observeOn(schedulers.mainThread()).subscribe({ metadata ->
        ...//lots of other events data here
        val sessionMetadata = SessionMetadata()
        sessionMetadata.id = metadata.searchId
        sessionMetadata.limiit = metadata.isRateLimit
        event1.session = sessionMetadata
        ...
        report(event1)
    })
}

fun logEvent2() {
    fetchMetaData().observeOn(schedulers.mainThread()).subscribe({ metadata ->
        ...//lots of other events data here
        val sessionMetadata = SessionMetadata()
        sessionMetadata.id = metadata.searchId
        sessionMetadata.limiit = metadata.isRateLimit
        event2.session = sessionMetadata
        ...
        report(event2)
    })
}

fun logEvent3() {
    fetchMetaData().observeOn(schedulers.mainThread()).subscribe({ metadata ->
        ...//lots of other events data here
        val sessionMetadata = SessionMetadata()
        sessionMetadata.id = metadata.searchId
        sessionMetadata.limiit = metadata.isRateLimit
        event3.session = sessionMetadata
        ...
        report(event3)
    })
}

我担心的是每次我们更改元数据的模式时,我们都需要更新所有的logEventX,我想知道我们是否可以subscribe在不同的函数中提取所有的并获取元数据?

标签: androidrx-javareactive-programmingrx-kotlin

解决方案


考虑使用 compose 和 doOnSuccess 的扩展函数

Single<MetaData>.handleLogging() : Single<MetaData>{
  return compose{
     it.doOnSuccess{ metaData ->
         val sessionMetadata = SessionMetadata()
         sessionMetadata.id = metadata.searchId
         sessionMetadata.limiit = metadata.isRateLimit
         report(sessionMetaData)
     }
  }
}

//usage
fetchMetaData().handleLogging().subscribe{
  //other uncommon logic here.
}

推荐阅读