如何使用RxJava实现Android Logcat相同日志的限流输出
按日志内容独立限流的RxJava实现方案
你当前的写法是对整个日志流做全局限流,所有日志共享同一个时间窗口,无法实现相同内容的日志独立按间隔过滤的需求。可以通过groupBy + throttleFirst的组合实现你的要求,具体实现如下:
核心实现代码
// 不需要重放历史日志可替换BehaviorSubject为PublishSubject private val log = PublishSubject.create<LogData>() // 日志流处理逻辑 log // 按日志内容+类型分组,data class默认的equals/hashCode会自动匹配相同message+type的日志 .groupBy { logData -> logData } // 每个独立分组单独应用限流,同一条日志在预设间隔内仅输出第一次 .flatMap { groupedLog -> groupedLog.throttleFirst(GAP_IN_MS, TimeUnit.MILLISECONDS) } .observeOn(AndroidSchedulers.mainThread()) .subscribe { (message, type) -> when(type) { LogType.DEBUG -> debugMessage(message) LogType.INFO -> infoMessage(message) LogType.ERR -> errorMessage(message) } }
注意事项
- 如果你后续扩展
LogData的构造参数(比如新增日志Tag字段),如果新字段不需要作为日志去重的判断依据,需要手动重写LogData的equals和hashCode方法,仅保留message和type作为相等性判断条件。 GAP_IN_MS为你自定义的限流间隔,单位为毫秒,比如设置为5000就代表同一条日志5秒内最多打印1次。- 如果你不需要在新订阅时收到最近的一条历史日志,使用
PublishSubject即可,避免重复打印历史日志。
内容的提问来源于stack exchange,提问作者Mateusz Łuczak
相关产品推荐
相关产品推荐

