android - 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
在不同的函数中提取所有的并获取元数据?
解决方案
考虑使用 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.
}
推荐阅读
- go - 如何调用静态 HTML 文件
- apache-spark - 带有自定义分区器的 Pyspark groupBy
- java - 在 Spring 配置中自动装配/注入一个类型的单个 bean 和一个类型的 bean 列表的 bean
- r - R:如何将循环生成的各种随机数存储在矩阵中?
- amazon-web-services - 用于从 AWS S3 位置复制 .sh 文件的 Curl 命令
- html - 在 Microsoft Flow 中正确格式化 HTML 表格
- android - Android Studio localhost 端口 - 开发期间的 Google 登录
- java - JUnit 5 @EnabledIfSystemProperty 无法按预期工作
- opengl - OpenGL:如何通过 API 知道顶点是否正在命中帧缓冲区
- typescript - 为什么我必须使用 [el as type] 来访问记录中的值?