如何解决点击事件时跳转到集合中的下一项
我有一些与interval
一起使用的物品,例如以下物品:
Observable.just(1,2,3,4)
.zipWith(Observable.interval(3500,TimeUnit.MILLISECONDS),(item,interval) -> item)
.subscribe()
当前流程是每个项目显示3500毫秒。 我要实现的是,如果用户在达到3500毫秒之前单击一个按钮,则跳到下一个项目。
我试图通过Subject
来实现这一点,但是没有用。
解决方法
也许,您可以使用amb()
将计时器与用户点击结合使用。 amb()
将发出计时器滴答声或用户单击,这取决于首先触发的是哪个。然后,您可以使用repeat()
来执行重复执行。
在下面的示例中,将计时器设置为5秒(而不是检查样本的3500毫秒)是对“用户点击”的模拟:
public static void main(String[] args) {
final Random random = new Random();
final Observable<String> userClick =
Observable.defer(() -> Observable.just(random.nextInt(8)))
.flatMap(t -> Observable.timer(t,SECONDS).map(__ -> (long) t))
.map(t -> String.format("user click after %d seconds",t));
final Observable<String> timer = Observable.timer(5,SECONDS)
.map(__ -> "tick after 5 seconds!");
Observable.just(1,2,3,4,5)
.zipWith(Observable.ambArray(timer,userClick)
.doOnNext(s -> System.out.printf("%s\n",s))
.repeat(),(item,tick) -> item)
.subscribe(System.out::println,System.err::println,() -> System.out.println("End!"));
Flowable.timer(1,MINUTES) // Just to block the main thread for a while
.blockingSubscribe();
}
如果运行该程序,则可以得到以下结果:
tick after 5 seconds!
1
user click after 3 seconds
2
tick after 5 seconds!
3
user click after 0 seconds
4
user click after 1 seconds
5
End!
,
这是对我有用的东西(takeUntil
运算符 condition ):
Observable.just(1,4)
.zipWith(
intervalRange()
.doOnNext {
onEachIntervalEmit(it)
}
.takeUntil(buttonUneStream)
.takeUntil(buttonUnStream)
.repeat()
有关intervalRang
定义的小细节:
private fun intervalRange(): Flowable<Long> {
return Flowable.intervalRange(
0,10,TimeUnit.SECONDS,AndroidSchedulers.mainThread()
)
}
我喜欢intervalRange
,因为它可以指定初始延迟。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。