RxJava 转换操作符 buffer

buffer操作符的功能:

1:能一次性集齐多个结果到列表中,订阅后自动清空相应结果,直到完全清除

2: 也可以周期性的集齐多个结果到列表中,订阅后自动清空相应结果,直到完全清除


例子1: 一次订阅2个


//一次订阅2个
        Observable.range(1,5).buffer(2).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onCompleted() {
                LogUtils.d("-----------------onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----------------->onError:");
            }

            @Override
            public void onNext(List<Integer> strings) {
                LogUtils.d("----------------->onNext:" + strings);
            }
        });


显示结果:

02-20 15:52:16.433 15913-15913/com.rxandroid.test1 D/----->: ----------------->onNext:[1, 2]
02-20 15:52:16.433 15913-15913/com.rxandroid.test1 D/----->: ----------------->onNext:[3, 4]
02-20 15:52:16.433 15913-15913/com.rxandroid.test1 D/----->: ----------------->onNext:[5]
02-20 15:52:16.433 15913-15913/com.rxandroid.test1 D/----->: -----------------onCompleted:


例子2:一次全部订阅

  //一次全部订阅
        Observable.range(1,5).buffer(5).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onCompleted() {
                LogUtils.d("-----------------onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----------------->onError:");
            }

            @Override
            public void onNext(List<Integer> strings) {
                LogUtils.d("----------------->onNext:" + strings);
            }
        });
结果:

02-20 15:54:56.423 21917-21917/com.rxandroid.test1 D/----->: ----------------->onNext:[1, 2, 3, 4, 5]
02-20 15:54:56.423 21917-21917/com.rxandroid.test1 D/----->: -----------------onCompleted:


例子3:每次剔除一个

  //每次剔除1个
        Observable.range(1, 5).buffer(5, 1).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onCompleted() {
                LogUtils.d("-----------------onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----------------->onError:");
            }

            @Override
            public void onNext(List<Integer> strings) {
                LogUtils.d("----------------->onNext:" + strings);
            }
        });

02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: ----------------->onNext:[1, 2, 3, 4, 5]
02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: ----------------->onNext:[2, 3, 4, 5]
02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: ----------------->onNext:[3, 4, 5]
02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: ----------------->onNext:[4, 5]
02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: ----------------->onNext:[5]
02-20 16:05:53.323 26556-26556/com.rxandroid.test1 D/----->: -----------------onCompleted:


注意当skip==count的时候,框架认为同一操作,一次就清除了count个元素

Observable.range(1, 5).buffer(5, 5).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onCompleted() {
                LogUtils.d("-----------------onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----------------->onError:");
            }

            @Override
            public void onNext(List<Integer> strings) {
                LogUtils.d("----------------->onNext:" + strings);
            }
        });


02-20 16:09:24.343 14991-14991/com.rxandroid.test1 D/----->: ----------------->onNext:[1, 2, 3, 4, 5]
02-20 16:09:24.343 14991-14991/com.rxandroid.test1 D/----->: -----------------onCompleted:


例子4:周期性订阅多个结果

 Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                if (subscriber.isUnsubscribed()) return;
                while (true) {
                    subscriber.onNext("消息" + SystemClock.elapsedRealtime());
                    SystemClock.sleep(2000);//每隔2s发送消息
                }

            }
        }).subscribeOn(Schedulers.io()).
                buffer(3, TimeUnit.SECONDS).//每隔3秒 取出消息
                subscribe(new Observer<List<String>>() {
            @Override
            public void onCompleted() {
                LogUtils.d("-----------------onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----------------->onError:");
            }

            @Override
            public void onNext(List<String> strings) {
                LogUtils.d("----------------->onNext:" + strings);
            }
        });


02-20 16:55:33.283 17087-18151/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370507667, 消息370509668]
02-20 16:55:36.323 17087-18151/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370511668]
02-20 16:55:39.303 17087-18151/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370513669, 消息370515669]
02-20 16:55:54.883 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370529168, 消息370531172]
02-20 16:55:57.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370533184]
02-20 16:56:00.883 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370535184, 消息370537184]
02-20 16:56:03.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370539184]
02-20 16:56:06.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370541185, 消息370543204]
02-20 16:56:09.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370545204]
02-20 16:56:12.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370547204, 消息370549204]
02-20 16:56:15.863 23122-23316/com.rxandroid.test1 D/----->: ----------------->onNext:[消息370551204]

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚洲小炫风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值