2017-04-05 11 views
0

私はRxAndroidBleを使用してベンチレータのリモートコントロールとして動作するアプリをやっています。私は退会に関する問題

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

を使用する場合ので、私はunsubscribeに問題があり、常に最初unsubscribe実行し、データの前に接続disconectが送信されたので、その後、私は仕事をdoesn't subscription.unsubscribe(); writeCharacteristicsを使用しています。私は必要なもの

は次のとおりです。

  • 私はすべての値
  • を送る[切断後、人工呼吸器
  • に接続したいボタンをクリックします。
  • この手順を繰り返すと、同じことを何度も何度も繰り返す必要があります。

いくつかのアイデアで私を助けることができますか? .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.3.0-SNAPSHOTで最近修正された、1.2.0には既知のバグ(無関係)があります。

+0

'.take(1)'は '.flatMap()'の下に置く必要があります。そうしないと、ロング書き込み操作が開始される前に接続が閉じられます。 –

+0

こんにちは!フィードバックありがとうございます! 私はtake(1)を.flatMap()の下に置いて動作させます!しかし、今私の質問は、なぜそれが接続する/書くとdisconectに時間がかかりますか? アンドロイドの待ち時間に問題があり、リアルタイム実行がありませんか? –

+0

自動接続をtrueに設定する理由はありますか?バッテリを節約するために、動作がどのようになっているかによって接続が大きく遅延します。 –