一、描述
定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次发射一项数据。
Window和Buffer类似,但不是发射来自原始Observable的数据包,它发射的是Observables,这些Observables中的每一个都发射原始Observable数据的一个子集,最后发射一个onCompleted通知。
和Buffer一样,Window有很多变体,每一种都以自己的方式将原始Observable分解为多个作为结果的Observable,每一个都包含一个映射原始数据的window。用Window操作符的术语描述就是,当一个窗口打开(when a window “opens”)意味着一个新的Observable已经发射(产生)了,而且这个Observable开始发射来自原始Observable的数据;当一个窗口关闭(when a window “closes”)意味着发射(产生)的Observable停止发射原始Observable的数据,并且发射终止通知onCompleted给它的观察者们。
二、示意图
三、示例代码
window操作符与buffer操作符类似,区别在于buffer操作符产生的结果是一个List缓存,而window操作符产生的结果是一个Observable,订阅者可以对这个结果Observable重新进行订阅处理。
1 | // 完整流程版 |
四、运行结果
1 | (完整流程版) |
项目代码已上传到Github:https://github.com/SherlockShi/RxJavaBestPractise
五、更多
在RxJava中有许多window的变体:
- window(closingSelector)
- window(windowOpenings, closingSelector)
- window(count)
- window(count, skip)
- window(timespan, unit[, scheduler])
- window(timespan, unit, count[, scheduler])
- window(timespan, timeshift, unit[, scheduler])
- window-backpressure
详情可查阅下面的参考资料。
六、参考资料
PS:欢迎关注 SherlockShi 个人博客