作用
字面意思:缓冲
其实就是将要发射的数据封装成多个缓冲区,每次发射一个缓冲区
示例用法
Observable.just("one", "two", "three", "four", "five")//创建了一个有5个数字的被观察者
// 3 means, it takes max of three from its start index and create list
// 1 means, it jumps one step every time
.buffer(3, 1)
.subscribe(getObserver());
这里贴一下观察者,为了能更清晰的看到发射出来的内容,我们将每一个item都打印出来
private Observer<List<String>> getObserver() {
return new Observer<List<String>>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(List<String> stringList) {
textView.append(" onNext size : " + stringList.size());
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : size :" + stringList.size());
for (String value : stringList) {
textView.append(" value : " + value);
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " : value :" + value);
}
}
@Override
public void onError(Throwable e) {
textView.append(" onError : " + e.getMessage());
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onError : " + e.getMessage());
}
@Override
public void onComplete() {
textView.append(" onComplete");
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onComplete");
}
};
}
运行结果
运行结果分析
首先,我们的被观察者里面有五个item,分别是1~5的英文,
然后看我们的设置 buffer(3,1)
,3为缓冲区大小,1可以理解为指针向后移动的距离
开始
(1,2,3)4,5 ->前三个item在缓存区中,分别是1,2,3;然后
1(2,3,4)5 ->缓冲区向后移动了一位,里面依然是三个item,分别是2,3,4,继续
1,2(3,4,5)->不解释,继续
1,2,3(4,5)->这时后面已经没有足够的item来填满缓冲区了,所以这时缓冲区里只能是4,5,继续
1,2,3,4(5)->好了,这个时候已经不能再向后移动了,因为后面没有值了,这时onComplete
只有一个例子还不是很好把握这个操作符,下面
如果我们改成buffer(3,2)
,会怎么样呢?我直接在这里发答案咯
(1,2,3)4,5 ->开始还是一样的
1,2(3,4,5)->这是第二步,直接向后移动了两个单位
1,2,3,4(5)->直接到了这一步了,怎么样和你理解的一样么?
总结
这个算是稍微有点复杂的操作符了,不知道这种形式大家能不能理解。。
这个系列只有干货,如果大家有什么好的建议的话欢迎在下面评论。或者觉得我哪里写的不够形象了,同样可以提出来。
网友评论