奥迪Q3xJava2 实战体系小说

昂CoraxJava2 实战知识梳理(1) – 后台执行耗费时间操作,实时通报 UI
更新

本田CR-VxJava2 实战知识梳理(2) –
总计一段时间内数据的平均值

卡宴xJava2 实战知识梳理(3) –
优化搜索联想成效

RAV4xJava2 实战知识梳理(4) – 结合 Retrofit
请求消息资源信息

CRUISERxJava2 实战知识梳理(5) –
简单及进阶的轮询操作

KugaxJava2 实战知识梳理(6) –
基于错误类型的重试请求

奥德赛xJava2 实战知识梳理(7) – 基于 combineLatest
已毕的输入表单验证

CRUISERxJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再读取网络数据的伸手过程

PAJEROxJava2 实战知识梳理(9) – 使用 timer/interval/delay
完结任务调度

RubiconxJava2 实战知识梳理(10) – 荧屏旋转导致 Activity
重建时回涨任务

TucsonxJava2 实战知识梳理(11) –
检查和测试互连网状态并机关重试请求

卡宴xJava2 实战知识梳理(12) – 实战讲解 publish & replay & share & refCount
& autoConnect

宝马7系xJava2 实战知识梳理(13) –
怎么着使得错误产生时不自动结束订阅关系

景逸SUVxJava2 实战知识梳理(14) – 在 token 过期时,刷新过期 token
并再一次发起呼吁

帕杰罗xJava2 实战知识梳理(15) – 达成3个简便的 MVP + 君越xJava + 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的别样用法,那篇文章写得很全,小编那里就不详细赘述了,我们能够参考:牧马人xJava
的就学之变换操作符 –
Buffer

④ 、参考文献

哈弗xJava 的上学之变换操作符 –
Buffer


越来越多小说,欢迎访问作者的 Android 知识梳理系列:

网站地图xml地图