2016-05-25 16 views
0

バックプレッシャーに問題があります。発行時にセンサのイベントを取得するためにパブリッシュ対象を使用し、トランザクション中にサブジェクトにサブスクライブする際にデータベースにデータを保存する必要があります。私は)私は100センサーイベントの行のを取得するたびに私は一括挿入をすることができますが、私は唯一の(.subscribeで一つのアイテムを取得することができます(100)演算子を.window使用する加速度計RxJavaバックプレッシャー

をしようとしている

たくありませんバッファー演算子を使用してイベントをドロップします。これを処理する正しい方法は何ですか?

@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

onErrorイベントで何をしたいかによって、2つのオプションがあります。

まず、.windowを使用するソリューションは正確です。Observableを発行するだけで、100個のイベントごとにObservableが1つずつ取得され、Observableはそのサブスクライブ時に100個のイベントを再生します。また、エラーの場合、エラーイベントも順番に再生します(AFAIK)。

あなたが.buffer(100)とソリューションは、あなたがonNextonErrorイベントを変換するために使用しますonErrorReturn()またはonErrorResumeNext()を置く必要があるの前に、あります、シーケンスのエラーイベントを気にしない場合。 onErrorの場合、bufferオペレータは直ちにそれを伝播して、一時バッファ(< 100)のイベントを失うからです。