我正在使用RxAndroidBle来发现周围设备的服务和一些特性。我遇到了一个问题,即在与第一个设备的连接未被取消后,与另一个设备建立连接不起作用。当涉及到另一个设备时,状态始终为“连接状态:RxBleConnectionState {DISCONNECTED}”。
以下是代码,任何人都可以帮我检查一下!
private Subscription createDeviceConnectionSubscription(final RxBleDevice
rxBleDevice){
bInternalStatus = DISCOVERRING;
Log.d(LOG_TAG, "start to discover the services on: " + rxBleDevice.getMacAddress().toString());
Subscription subscription = rxBleDevice.establishConnection(false)
.timeout(10, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.from(mWorker.getLooper()))
.flatMap(new Func1<RxBleConnection, Observable<gattConnectionResults>>() {
@Override
public Observable<gattConnectionResults> call(RxBleConnection rxBleConnection) {
return Observable.zip(
rxBleConnection.discoverServices(3, TimeUnit.SECONDS),
rxBleConnection.readCharacteristic(UUID.fromString("UUID1")),
rxBleConnection.readCharacteristic(UUID.fromString("UUID2")),
new Func3<RxBleDeviceServices, byte[], byte[], gattConnectionResults>() {
@Override
public gattConnectionResults call(RxBleDeviceServices rxBleDeviceServices, byte[] bytes, byte[] bytes2) {
//......
return results;
}
}
);
}
})
.subscribe(subscriber);
rxBleDevice.observeConnectionStateChanges()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<RxBleConnection.RxBleConnectionState>() {
@Override
public void call(RxBleConnection.RxBleConnectionState rxBleConnectionState) {
Log.d("Gatt Connection State", ""+rxBleConnectionState);
}
});
return subscription;
}
Subscriber<gattConnectionResults> subscriber = new
Subscriber<gattConnectionResults>() {
@Override
public void onCompleted() {
Log.d(LOG_TAG, "RXXX on completed called!!!");
if(mDeviceConnectionSubscription!=null){
handleConnectionOver();
}
}
@Override
public void onError(Throwable e) {
Log.d(LOG_TAG, "RXXX Connection error!!! " + e);
if(mDeviceConnectionSubscription!=null){
handleConnectionOver();
}
}
@Override
public void onNext(gattConnectionResults results) {
}
}
};
private void handleConnectionOver(){
bInternalStatus = STOPPED;
if(mDeviceConnectionSubscription!=null && !mDeviceConnectionSubscription.isUnsubscribed()){
mDeviceConnectionSubscription.unsubscribe();
mDeviceConnectionSubscription = null;
}
}
感谢@ s-noopy,在移动取消订阅到onNext()之后,RxBle的日志是:
05-15 D/RxBle#Radio: QUEUED RxBleRadioOperationConnect(192750313)
05-15 D/RxBle#Radio: STARTED RxBleRadioOperationConnect(192750313)
05-15 V/RxBle#BleConnectionCompat: Connecting without reflection
05-15 D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0
05-15 D/RxBle#Radio: FINISHED RxBleRadioOperationConnect(192750313)
05-15 D/RxBle#Radio: QUEUED RxBleRadioOperationServicesDiscover(178598822)
05-15 D/RxBle#Radio: STARTED RxBleRadioOperationServicesDiscover(178598822)
05-15 D/RxBle#BluetoothGatt: onServicesDiscovered status=0
05-15 D/RxBle#Radio: QUEUED RxBleRadioOperationCharacteristicRead(241700341)
05-15 D/RxBle#Radio: QUEUED RxBleRadioOperationCharacteristicRead(24572440)
05-15 D/RxBle#Radio: FINISHED RxBleRadioOperationServicesDiscover(178598822)
05-15 D/RxBle#Radio: STARTED RxBleRadioOperationCharacteristicRead(241700341)
05-15 D/RxBle#BluetoothGatt: onCharacteristicRead characteristic=00002a00-0000-1000-8000-00805f9b34fb status=0
05-15 D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicRead(241700341)
05-15 D/RxBle#Radio: STARTED RxBleRadioOperationCharacteristicRead(24572440)
05-15 D/RxBle#BluetoothGatt: onCharacteristicRead characteristic=00002a29-0000-1000-8000-00805f9b34fb status=0
05-15 D/RxBle#Radio: QUEUED RxBleRadioOperationDisconnect(204169407)
05-15 D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicRead(24572440)
05-15 D/RxBle#Radio: STARTED RxBleRadioOperationDisconnect(204169407)
05-15 D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=0
05-15 D/RxBle#Radio: FINISHED RxBleRadioOperationDisconnect(204169407)
答案 0 :(得分:0)
您应为每个Subscriber
创建一个新的Subscription
。 Subscriber
是有状态的,一旦获得onCompleted
或onError
,它就不会再次订阅任何其他Observable
。
或者,您应该使用Observer
代替Subscriber
。 Observer
是无国籍人。