加速度计RxJava Backpressure

时间:2016-05-25 21:33:17

标签: android rx-java android-sensors backpressure

背压问题。使用发布主题来发送传感器事件,并且需要在订阅主题时将数据保存到数据库中。

我一直在尝试使用.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
                        }
                    }
            );

1 个答案:

答案 0 :(得分:1)

您有两个选项,具体取决于您对onError事件的处理方式。

首先,使用.window的解决方案是正确的,它只是发出一个Observable,每100个事件就会得到一个Observable,当你订阅它时,Observable将重放这100个事件。此外,如果出现错误,它也将按顺序重放错误事件(AFAIK)。

如果你不关心序列中的错误事件,那么就有.buffer(100)的解决方案,你应该在其前面放置onErrorReturn()onErrorResumeNext()你将使用的将onError事件转换为onNext。这是因为在onError的情况下,buffer运算符会立即传播它,以便丢失临时缓冲区中的事件(&lt; 100)。