背压问题。使用发布主题来发送传感器事件,并且需要在订阅主题时将数据保存到数据库中。
我一直在尝试使用.window(100)运算符,所以每当我连续获得100个传感器事件时我就可以批量插入但是我只能在.subscribe()
获得一个项目不想使用缓冲区运算符来删除事件。处理这个问题的正确方法是什么?
@Override
public void onSensorChanged(SensorEvent sevent) {
Sensor sensor = sevent.sensor;
switch (sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
sensorEventPublishSubject.onNext(sevent);
break;
}
}
sensorEventPublishSubject
.map(event ->
new AccModel(
event.values[0],
event.values[1],
event.values[2],
event.accuracy
)
)
.window(100)
.subscribe(
new Action1<Observable<AccModel>>() {
@Override
public void call(Observable<AccModel> accModelObservable) {
//insert in db
}
}
);
答案 0 :(得分:1)
您有两个选项,具体取决于您对onError事件的处理方式。
首先,使用.window
的解决方案是正确的,它只是发出一个Observable,每100个事件就会得到一个Observable,当你订阅它时,Observable将重放这100个事件。此外,如果出现错误,它也将按顺序重放错误事件(AFAIK)。
如果你不关心序列中的错误事件,那么就有.buffer(100)
的解决方案,你应该在其前面放置onErrorReturn()
或onErrorResumeNext()
你将使用的将onError
事件转换为onNext
。这是因为在onError
的情况下,buffer
运算符会立即传播它,以便丢失临时缓冲区中的事件(&lt; 100)。