前言
如果在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();
}
}