2017-04-05 184 views
0

我正在做一个应用程序,用作使用RxAndroidBle的呼吸机的遥控器。我与unsubscribe一个问题,因为当我使用取消订阅的问题

.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(Uuids.UUID_RX, flaktCommandConcat.getBytes())) 

,之后我用subscription.unsubscribe(); doesn't工作writeCharacteristics因为unsubscribe运行总是先和数据之前的连接disconect发送。

我需要的是:

  • 当我点击我要连接呼吸机
  • 的按钮,然后将所有值
  • 然后断开连接。
  • 如果我重复这个过程,它将需要一遍又一遍地做同样的事情。

有人能帮我一些想法吗?我试图使用.delay(1000, Time.MILISECONDS),它工作,但需要很长时间才能将信息发送到呼吸机。

这是我的代码:

public void writeRxCharacteristics(String flaktCommandConcat){ 

    rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS); 


    subscription = rxBleDevice.establishConnection(true) //false 
      .observeOn(AndroidSchedulers.mainThread()) 
      .flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder() 
      .setCharacteristicUuid(Uuids.UUID_RX) 
      .setBytes(flaktCommandConcat.getBytes()) 
      .build()) 

      .subscribe(
        byteArray -> { 
         Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray)); 
        }, 

        throwable -> { 
         Log.d("CharacteristicValue","Throwable: " + throwable.toString()); 
         rxBleActivity.onScanFailure(throwable, getContext()); 
        } 
      ); 


    rxBleDevice.observeConnectionStateChanges() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .delay(1000, TimeUnit.MILLISECONDS) 
      .subscribe(
        rxBleConnectionState -> { 
         Log.d("RxBleConnectionState", " CON_STATUS: " + rxBleConnectionState); 
         disconnect(); 

        }, 
        throwable -> { 
         Log.d("ConnectionStateChanges","Throwable: " + throwable.toString()); 

        } 
      ); 
} 
public void disconnect() { 
if (subscription != null && !subscription.isUnsubscribed()) { 
subscription.unsubscribe(); 
subscription = null; 
} 
Log.d("CONNECTION2", " CON_STATUS: " + rxBleDevice.getConnectionState().toString()); 
} 
+0

您在描述中提到了'MILISECONDS',但在代码中使用了'MILLISECONDS' - 如果其中一个拼写错误,请修复它。 – halfer

回答

0

看起来你并不需要一个很长的写在这里。你的数据是否超过20字节?

无论如何,当Observable<RxBleConnection>退订时,库会释放连接。如果我是你,我会怎么做:

public void writeRxCharacteristics(String flaktCommandConcat){ 
    rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS); 

    rxBleDevice.establishConnection(true) //false 
      .flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder() 
       .setCharacteristicUuid(Uuids.UUID_RX) 
       .setBytes(flaktCommandConcat.getBytes()) 
       .build() 
      ) 
      .take(1) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(
        byteArray -> { 
         Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray)); 
        }, 

        throwable -> { 
         Log.d("CharacteristicValue","Throwable: " + throwable.toString()); 
         rxBleActivity.onScanFailure(throwable, getContext()); 
        } 
      ); 

请确保你没有过度使用长写。它在1.2.0中有一个已知的bug(无关),最近在1.3.0-SNAPSHOT中被修复。

+0

'.take(1)'需要放在'.flatMap()'之下,否则连接将在长写入操作开始之前关闭。 –

+0

嗨!感谢您的反馈! 我把(1)放在.flatMap()下面,它工作!但我现在的问题是,为什么连接/写入和丢弃这么长时间? 这是一个没有实时执行的android延迟问题吗? –

+0

为什么选择将autoconnect设置为true有什么原因吗?由于它的工作原理,它会严重延迟连接,以节省电池。 –