RxJava操作符实践:3_过滤操作之9_sample

一、描述

定期发射Observable最近发射的数据项。

Sample操作符定时查看一个Observable,然后发射自上次采样以来它最近发射的数据。

在某些实现中,有一个ThrottleFirst操作符的功能类似,但不是发射采样期间的最近的数据,而是发射在那段时间内的第一项数据。

RxJava将这个操作符实现为sample和throttleLast。

注意:如果自上次采样以来,原始Observable没有发射任何数据,这个操作返回的Observable在那段时间内也不会发射任何数据。

sample(别名throttleLast)的一个变体按照你参数中指定的时间间隔定时采样(TimeUnit指定时间单位)。

sample的这个变体默认在computation调度器上执行,但是你可以使用第三个参数指定其它的调度器。

二、示意图

sample

三、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
protected void runSampleCode() {
Observable observable = Observable.interval(1000, TimeUnit.MILLISECONDS)
.sample(2200, TimeUnit.MILLISECONDS);

subscriber = new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted.");
}

@Override
public void onError(Throwable e) {
System.out.println("onError: " + e.getMessage());
}

@Override
public void onNext(Long aLong) {
System.out.println("onNext: " + aLong);
}
};

observable.subscribe(subscriber);
}

@Override
protected void onDestroy() {
super.onDestroy();

if (subscriber != null
&& !subscriber.isUnsubscribed()) {
subscriber.unsubscribe();
}
}

四、运行结果

1
2
3
4
5
6
7
onNext: 1
onNext: 3
onNext: 5
onNext: 7
onNext: 9
onNext: 12
(...)

项目代码已上传到Github:https://github.com/SherlockShi/RxJavaBestPractise

五、更多

sample操作符还有以下变体:

  • sample(long,TimeUnit) 和 throttleLast(long,TimeUnit)
  • sample(long,TimeUnit,Scheduler) 和 throttleLast(long,TimeUnit,Scheduler)
  • sample(Observable)

跟sample相关的操作符还有:

  • throttleFirst(long,TimeUnit)
  • throttleFirst(long,TimeUnit,Scheduler)

详情可查阅下面的参考资料。

六、参考资料

ReactiveX官方文档

ReactiveX文档中文翻译

PS:欢迎关注 SherlockShi 个人博客

感谢你的支持,让我继续努力分享有用的技术和知识点!