RxAndroidBle long write — обратный вызов для каждого записанного пакета

Я выполняю длинную операцию записи, отправляя пакеты по 16 байт за раз. Я хотел бы, чтобы индикатор выполнения показывал пользователю ход выполнения длинной записи, поэтому мне нужен какой-то обратный вызов для каждого раза, когда пакет был записан.

Судя по документации, это делает setWriteOperationAckStrategy. Однако при запуске следующего кода я вижу только одно сообщение, выводимое в журнал. Что я здесь делаю неправильно?

subscription = connection.flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
    .setCharacteristicUuid(uuid)
    .setBytes(bytes)
    .setMaxBatchSize(16)
    .setWriteOperationAckStrategy(new RxBleConnection.WriteOperationAckStrategy() {
        @Override
        public Observable<Boolean> call(Observable<Boolean> booleanObservable) {
            Log.d("TEST", "batch written");
            return booleanObservable;
        }
    })
    .build()

person rjr-apps    schedule 30.06.2017    source источник
comment
Привет! setWriteOperationAckStrategy похож на стандартные преобразователи Observable RxJava. Чтобы сохранить низкое распределение, мы склонны модифицировать исходный наблюдаемый объект, а не создавать новый после завершения каждой партии. Я изменил ваш пост с предложенным тестовым сценарием.   -  person pawel.urban    schedule 30.06.2017
comment
Это сделало это! Вы можете опубликовать это как ответ, и я отмечу это правильно, если хотите. Спасибо! :)   -  person rjr-apps    schedule 30.06.2017
comment
Круто, я разместил пример кода вместе с ответом :)   -  person pawel.urban    schedule 01.07.2017


Ответы (2)


setWriteOperationAckStrategy похож на стандартные преобразователи Observable RxJava. Чтобы сохранить низкое распределение, мы склонны модифицировать исходный наблюдаемый объект, а не создавать новый после завершения каждой партии.

subscription = connection.flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
    .setCharacteristicUuid(uuid)
    .setBytes(bytes)
    .setMaxBatchSize(16)
    .setWriteOperationAckStrategy(new RxBleConnection.WriteOperationAckStrategy() {
        @Override
        public Observable<Boolean> call(Observable<Boolean> booleanObservable) {
            Log.d("TEST", "batch written");
            return booleanObservable
                .doOnNext(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        Log.d("TEST", "batch written");
                    }
                });
        }
    })
    .build()
person pawel.urban    schedule 01.07.2017

Я думаю, что этот ответ был для RxJava, для RxJava2 это обновленный синтаксис лямбда:

.setWriteOperationAckStrategy(booleanObservable -> {
        Log.d("TEST", "batch written");
        return booleanObservable
            .doOnNext(aBoolean -> {
              Log.d("TEST", "batch written");
            });
      }

Полный:

.setWriteOperationAckStrategy(new RxBleConnection.WriteOperationAckStrategy() {
  @Override
  public Observable<Boolean> apply(Observable<Boolean> booleanObservable) {
    Log.d("TEST", "batch written");
    return booleanObservable
        .doOnNext(new Consumer<Boolean>() {
           @Override
           public void accept(Boolean aBoolean) {
             Log.d("TEST", "batch written");
           }
         });
  }
person RandomIO    schedule 17.04.2020