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

Most upvoted comments

I will probably try to release it tomorrow.