RxJava2 实战系列文章

RxJava2 实战知识梳理(1) – 后台执行耗时操作,实时通报 UI
更新
RxJava2 实战知识梳理(2) –
计算一段时间内数据的平均值
RxJava2 实战知识梳理(3) –
优化搜索联想功能
RxJava2 实战知识梳理(4) – 结合 Retrofit
请求新闻消息
RxJava2 实战知识梳理(5) –
简单和进阶的轮询操作
RxJava2 实战知识梳理(6) –
基于左类型的重试请求
RxJava2 实战知识梳理(7) – 基于 combineLatest
实现的输入表单验证
RxJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再念博网络数据的乞求过程
RxJava2 实战知识梳理(9) – 使用 timer/interval/delay
实现任务调度
RxJava2 实战知识梳理(10) – 屏幕旋转导致 Activity
重建时回升任务
RxJava2 实战知识梳理(11) –
检测网络状态并机关重试请求
RxJava2 实战知识梳理(12) – 实战讲解 publish & replay & share & refCount
& autoConnect
RxJava2 实战知识梳理(13) –
如何使错误有时未活动停止订阅关系
RxJava2 实战知识梳理(14) – 在 token 过期时,刷新过期 token
并重复发起呼吁
RxJava2 实战知识梳理(15) – 实现一个简易的 MVP + RxJava + Retrofit
应用


一、前言

今天,我们继承就
RxJava-Android-Samples
的步子,一起看一下RxJava2每当实战中的行使,在这个类别蒙,第二只的事例的叙说如下:

新濠娱乐 1

简地翻过来:如果以2s外连接点击了一个按钮五破,那么我们才会收到一个“你点击了该按钮五赖”的辰,而休是五只”你点击了该按钮”的波。这个示例的目的是受咱学会怎么采取buffer操作符。

二、示例

2.1 应用场景

有心人想了一下,在平常底花色遭到,我们若不见面逢需要统计一段时间内用户点击了略微次按钮这种要求。

只是,我们偶尔会需要计算一段时间内的平分数据,例如统计一段时间内之平均温度,或者统计一段时间内的平分位置。在触发RxJava前面,我们一般会用即刻段时日内统计到的数目都小存起来,等到需要创新的工夫点到了后头,再将这些多少整合起来,计算这些数据的平均值。

当今,我们虽来拘禁一下,用RxJava2什么错过落实之要求。

2.2 示例代码

这里,我们透过一个Handler循环地发送信息,实现间隔定时间进行温度的测量,但是当测量后,我们并无实时地换代界面的温度显示,而是每隔3s统计一软过去就段日子内的平均温度。

public class BufferActivity extends AppCompatActivity {

    private PublishSubject<Double> mPublishSubject;
    private CompositeDisposable mCompositeDisposable;
    private TextView mTv;
    private SourceHandler mSourceHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buffer);
        mTv = (TextView) findViewById(R.id.tv_buffer);
        mPublishSubject = PublishSubject.create();
        DisposableObserver<List<Double>> disposableObserver = new DisposableObserver<List<Double>>() {
            @Override
            public void onNext(List<Double> o) {
                double result = 0;
                if (o.size() > 0) {
                    for (Double d : o) {
                        result += d;
                    }
                    result = result / o.size();
                }
                Log.d("BufferActivity", "更新平均温度:" + result);
                mTv.setText("过去3秒收到了" + o.size() + "个数据, 平均温度为:" + result);
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onComplete() {

            }
        };
        mPublishSubject.buffer(3000, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver);
        mCompositeDisposable = new CompositeDisposable();
        mCompositeDisposable.add(disposableObserver);
        //开始测量温度。
        mSourceHandler = new SourceHandler();
        mSourceHandler.sendEmptyMessage(0);
    }

    public void updateTemperature(double temperature) {
        Log.d("BufferActivity", "温度测量结果:" + temperature);
        mPublishSubject.onNext(temperature);
    }

    private class SourceHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            double temperature = Math.random() * 25 + 5;
            updateTemperature(temperature);
            //循环地发送。
            sendEmptyMessageDelayed(0, 250 + (long) (250 * Math.random()));
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mSourceHandler.removeCallbacksAndMessages(null);
        mCompositeDisposable.clear();

    }
}

实际的周转结果吗:

新濠娱乐 2

支配高出口的音呢:

新濠娱乐 3

其三、示例解析

3.1 原理

于上面的例子中,我们下了buffer(int time, Unit timeUnit),其规律图如下所示:

新濠娱乐 4

函数中的蝇头个形参分别指向承诺是光阴的价值和单位,这样,当我们经过下面这词发送事件:

mPublishSubject.onNext(temperature);

事件并无会见一直传送到ObserveronNext道中,而是放在缓冲区中,直到事件到以后,再以持有以当下段缓冲事件外放入缓冲区中的价值,放在一个List未遭一块发送至下游。

3.2 Buffer 的别样用法

关于Buffer的外用法,这篇稿子写得非常咸,我此虽非详细赘述了,大家可以参见:RxJava
的学之移操作符 –
Buffer。

季、参考文献

RxJava 的上之易操作新濠娱乐符 –
Buffer


双重多篇,欢迎访问我之 Android 知识梳理系列:

  • Android
    知识梳理目录:http://www.jianshu.com/p/fd82d18994ce
  • 个人主页:http://lizejun.cn
  • 村办知识总结目录:http://lizejun.cn/categories/
网站地图xml地图