RxAndroidBle: RxBle is not show disconnected when BluetoothGatt: android.os.DeadObjectException is thrown
Summary
CONNECTED state forever when BluetoothGatt: android.os.DeadObjectException is thrown
My code in below:
private static final UUID characteristicUuid = UUID.fromString("25A80001-6478-11E6-BDF4-AD3BCC77759F");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example4);
ButterKnife.bind(this);
bleDevice = SampleApplication.getRxBleClient(this).getBleDevice(macAddress);
connectionObservable = prepareConnectionObservable();
bleDevice.observeConnectionStateChanges().subscribe(state -> {
Log.i(getClass().getSimpleName(), "" + state.toString());
});
connect();
}
private Observable<RxBleConnection> prepareConnectionObservable() {
return bleDevice
.establishConnection(false)
.takeUntil(disconnectTriggerSubject)
.compose(bindUntilEvent(PAUSE))
.compose(new ConnectionSharingAdapter());
}
@OnClick(R.id.connect)
public void connect() {
connectionObservable.flatMap(RxBleConnection::discoverServices)
.flatMap(rxBleDeviceServices -> rxBleDeviceServices.getCharacteristic(characteristicUuid))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(() -> Log.i(getClass().getSimpleName(), "start connect "))
.subscribe(
characteristic -> {
Log.i(getClass().getSimpleName(), "Hey, connection has been established!");
},
this::onConnectionFailure,
this::onConnectionFinished
);
}
@OnClick(R.id.dissconnect)
public void triggerDisconnect() {
disconnectTriggerSubject.onNext(null);
}
@OnClick(R.id.read_rssi)
public void readRSSI() {
if (bleDevice.getConnectionState() != RxBleConnection.RxBleConnectionState.CONNECTED) {
return;
}
connectionObservable.flatMap(rxBleConnection -> rxBleConnection.readRssi())
.subscribe(rssi -> {
Log.i(getClass().getSimpleName(), "RSSI = " + rssi);
}, throwable -> {
Log.i(getClass().getSimpleName(), "Connection error: " + throwable);
});
}
- Sometime, when Bluetooth in phone is crashed => I call readRSSI => BluetoothGatt: android.os.DeadObjectException is thrown. But RxBleDevice#getConnectionState() return RxBleConnectionState{CONNECTED}.
- When call readRSSI again, BluetoothGatt: android.os.DeadObjectException still thown.
- After, I call triggerDisconnect() method => connect() method=> try to readRSSI, and it work fine.
Actual result
BluetoothGatt: android.os.DeadObjectException is thown Please see log:
09-01 11:49:24.135 13204-13304/com.mysoftsource.vuzitech D/RxBle#Radio: QUEUED RxBleRadioOperationReadRssi(28807445)
09-01 11:49:24.136 13204-13302/com.mysoftsource.vuzitech D/RxBle#Radio: STARTED RxBleRadioOperationReadRssi(28807445)
09-01 11:49:24.138 13204-13204/com.mysoftsource.vuzitech D/BluetoothGatt: readRssi() - device: F7:A2:68:4B:DA:D3
09-01 11:49:24.139 13204-13204/com.mysoftsource.vuzitech E/BluetoothGatt: android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.bluetooth.IBluetoothGatt$Stub$Proxy.readRemoteRssi(IBluetoothGatt.java:1006)
at android.bluetooth.BluetoothGatt.readRemoteRssi(BluetoothGatt.java:1121)
at com.polidea.rxandroidble.internal.operations.RxBleRadioOperationReadRssi.startOperation(RxBleRadioOperationReadRssi.java:30)
at com.polidea.rxandroidble.internal.RxBleSingleGattRadioOperation.protectedRun(RxBleSingleGattRadioOperation.java:56)
at com.polidea.rxandroidble.internal.RxBleRadioOperation$1.call(RxBleRadioOperation.java:39)
at com.polidea.rxandroidble.internal.RxBleRadioOperation$1.call(RxBleRadioOperation.java:35)
at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
at rx.Observable.unsafeSubscribe(Observable.java:10256)
at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6126)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
09-01 11:49:24.141 13204-13302/com.mysoftsource.vuzitech D/RxBle#Radio: FINISHED RxBleRadioOperationReadRssi(28807445)
09-01 11:49:25.134 13204-13304/com.mysoftsource.vuzitech D/RxBle#Radio: QUEUED RxBleRadioOperationReadRssi(189325052)
09-01 11:49:25.136 13204-13302/com.mysoftsource.vuzitech D/RxBle#Radio: STARTED RxBleRadioOperationReadRssi(189325052)
09-01 11:49:25.138 13204-13204/com.mysoftsource.vuzitech D/BluetoothGatt: readRssi() - device: F7:A2:68:4B:DA:D3
09-01 11:49:25.140 13204-13204/com.mysoftsource.vuzitech E/BluetoothGatt: android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.bluetooth.IBluetoothGatt$Stub$Proxy.readRemoteRssi(IBluetoothGatt.java:1006)
at android.bluetooth.BluetoothGatt.readRemoteRssi(BluetoothGatt.java:1121)
at com.polidea.rxandroidble.internal.operations.RxBleRadioOperationReadRssi.startOperation(RxBleRadioOperationReadRssi.java:30)
at com.polidea.rxandroidble.internal.RxBleSingleGattRadioOperation.protectedRun(RxBleSingleGattRadioOperation.java:56)
at com.polidea.rxandroidble.internal.RxBleRadioOperation$1.call(RxBleRadioOperation.java:39)
at com.polidea.rxandroidble.internal.RxBleRadioOperation$1.call(RxBleRadioOperation.java:35)
at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
at rx.Observable.unsafeSubscribe(Observable.java:10256)
at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6126)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
09-01 11:49:25.141 13204-13302/com.mysoftsource.vuzitech D/RxBle#Radio: FINISHED RxBleRadioOperationReadRssi(189325052)
Expected result
When BluetoothGatt: android.os.DeadObjectException is thrown => call disconnect and shown DISCONNECTED state
Library version
1.3.3
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Comments: 16 (8 by maintainers)
Commits related to this issue
- Added Bluetooth Adapter state monitoring to connection (#275) `DeadObjectException` is usually thrown when interacting with `BluetoothAdapter` or `BluetoothGatt` instance that was obtained before blue... — committed to dariuszseweryn/RxAndroidBle by dariuszseweryn 7 years ago
- Added Bluetooth Adapter state monitoring to connection (#275) (#278) `DeadObjectException` is usually thrown when interacting with `BluetoothAdapter` or `BluetoothGatt` instance that was obtained bef... — committed to dariuszseweryn/RxAndroidBle by dariuszseweryn 7 years ago
- Fixed a null RxBleConnection being returned when connecting. (#275) (#278) `RxBleConnection` can be instantiated only after `BluetoothGatt` is available. Changed the Connector code from `Observable.ju... — committed to dariuszseweryn/RxAndroidBle by dariuszseweryn 7 years ago
- Added `ConnectorImpl` test for getting `RxBleConnection` only after `ConnectOperation` will finish (#275) (#278) The `RxBleConnection` needs `BluetoothGatt` to be created. The `BluetoothGatt` is avail... — committed to dariuszseweryn/RxAndroidBle by dariuszseweryn 7 years ago
I will probably try to release it tomorrow.