RxAndroidBle长写 - 每个批处理写回调

时间:2017-06-30 17:43:41

标签: rxandroidble

我正在进行长写操作,一次发送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()

2 个答案:

答案 0 :(得分:1)

setWriteOperationAckStrategy类似于标准的RxJava的Observable变换器。为了保持较低的分配,我们倾向于修改源可观察性,而不是在每个批次完成时创建一个新的。

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()

答案 1 :(得分:1)

我认为这个答案是针对RxJava的,对于RxJava2,这是更新的lambda语法:

.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");
           }
         });
  }