您当前的位置: 首页 >  Java

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- RxJava】RxJava2.0 实践(二),计算一段时间内数据的平均值

Kevin-Dev 发布时间:2019-03-25 17:50:20 ,浏览量:0

前言

如果在2s内连续点击了一个按钮五次,那么我们只会收到一个“你点击了该按钮五次”的时间,而不是五个"你点击了该按钮"的事件。这个示例的目的是让我们学会如何应用 buffer 操作符。

效果图

在这里插入图片描述 在这里插入图片描述

应用场景

在平时的项目中,我们有时候会需要计算一段时间内的平均数据,例如统计一段时间内的平均温度,或者统计一段时间内的平均位置。在接触RxJava之前,我们一般会将这段时间内统计到的数据都暂时存起来,等到需要更新的时间点到了之后,再把这些数据结合起来,计算这些数据的平均值。

示例代码 1. 添加依赖
	//Butter Knife
    implementation 'com.jakewharton:butterknife:10.2.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'

    //TitleBar
    implementation 'com.github.getActivity:TitleBar:8.6'

    //RxJava
    implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
2. 布局文件



    

    

3. 逻辑代码
public class MainActivity extends BaseActivity {
    private static final String TAG = "MainActivity";

    @BindView(R.id.tv_buffer)
    TextView mTvResult;

    private PublishSubject mPublishSubject;
    private CompositeDisposable mCompositeDisposable;
    private SourceHandler mSourceHandler;


    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        mPublishSubject = PublishSubject.create();
        DisposableObserver disposableObserver = new DisposableObserver() {
            @Override
            public void onNext(List o) {
                double result = 0;
                if (o.size() > 0) {
                    for (Double d : o) {
                        result += d;
                    }
                    result = result / o.size();
                }
                Log.d(TAG, "更新平均温度:" + result);
                mTvResult.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(TAG, "温度测量结果:" + 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();
    }
}
关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0390s