2017-04-05 183 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有什麼原因嗎?由於它的工作原理,它會嚴重延遲連接,以節省電池。 –