RxJava2中.startWith(..)失效:如何实现每10秒重复发射目标序列?
解决RxJava定时重复发射完整序列的问题
嘿,我来帮你搞定这个RxJava的问题!你的代码逻辑里踩了个小误区,咱们先拆解清楚问题出在哪,再给你正确的实现方式。
你的代码为什么不符合预期?
你用o1.startWith(change2tervalToString)的写法,本质是把change2tervalToString的事件放在o1的事件前面,但这里有个关键逻辑错误:
intervalObservable是无限持续发射的Observable,它每隔10秒就会发一个值,永远不会结束;startWith的执行逻辑是:订阅目标Observable时,先订阅传入的前置Observable,只有当前置Observable完全结束后,才会订阅原Observable(也就是你的o1)。
因为change2tervalToString永远不会结束,所以o1根本没机会被订阅,自然也就不会发射列表里的项,你只能每隔10秒收到一个"STARTER!"。
正确的实现方式
我们需要的效果是:每隔10秒,完整发射一次"STARTER!" + 列表所有项。这时候应该用flatMap操作符,让定时事件成为触发源,每次触发都生成一个包含"STARTER!"和列表项的新序列。
代码示例
List<String> list = // 你的长度为5的列表 Observable<String> o1 = Observable.fromIterable(list); // 用fromIterable比fromArray更简洁 // 每隔10秒触发一次,若需要立即执行第一次,可改成interval(0, 10, TimeUnit.SECONDS) Observable<Long> intervalObservable = Observable.interval(10, TimeUnit.SECONDS); Observable<String> per10sec = intervalObservable .flatMap(ignored -> // 每次定时触发时,先发射"STARTER!",再拼接o1的所有项 Observable.just("STARTER!") .concatWith(o1) );
代码解释
flatMap会把intervalObservable发射的每个Long值(我们用ignored忽略它,因为不需要这个数值本身),转换成一个新的Observable序列;Observable.just("STARTER!").concatWith(o1)保证了每次都会先发射"STARTER!",再依次发射列表里的所有项;- 这样每隔10秒,就会完整触发一次你期望的序列,完全符合需求。
内容的提问来源于stack exchange,提问作者user6747491
相关产品推荐
相关产品推荐

