關於藍芽bluetooth開發中遇到的DeadObjectException異常

weixin_34185364發表於2018-02-03

因為工作需要,做了一個有關藍芽裝置的專案,時間不長,層次也不深,相信你只需要一個對BLE稍稍有些瞭解,再加上一款方便的框架,就能完成簡單的開發(想做不簡單的,那是框架能滿足的嗎??)。這裡推薦一個,讓你不至於去滿世界找

Android BLE基礎操作框架,基於回撥,操作簡單。包含掃描、多連線、廣播包解析、服務讀寫及通知等功能。

本篇文章主要想記錄一下開發過程中遇到的唯一一個浪費了時間的問題,為什麼說是浪費時間,待會就能知道了。如題所說——DeadObjectException異常

大多數的BLE相關專案,都會需要讀取訊號強度、裝置電量、連線及重新連線等等一些功能,我遇到DeadObjectException,出現在重連之後讀取訊號強度上。也許你遇到這個異常的情況和我不一樣,也許依然會有所幫助。

 public synchronized void readRssi(String address) {
        if (address != null) {
            mAddress = address;
        }

        if (mRssiRunable == null) {
            mRssiRunable = new Runnable() {
                @Override
                public void run() {
                    Log.i("readRssi:" + mAddress);
                    BleDevice device = Engine.getInstance().getDeviceFromConnection(
                            mAddress);
                    if (device != null && device.isConnected()) {
                        BluetoothGatt gatt = device.getGatt();
                        if (gatt != null) {
                            Log.i("readRssi gatt:" + gatt + gatt.readRemoteRssi());
                            gatt.readRemoteRssi();
                            mHandler.postDelayed(this,300);
                        }
                    }

                }
            };
        }
        mHandler.postDelayed(mRssiRunable, 300);
    }

上面是我readRssi的程式碼,而我的問題出現在 gatt.readRemoteRssi()上。


9625067-f1536eb11061a806.png
DeadObjectException.png

DeadObjectException看到這個異常,就是字面意思嘛,某個物件掛了。
於是我打log、debug除錯,發現Gatt相關並沒有報空。在這之前並沒有遇到過這個異常,我試圖try住這個小麻煩,結果居然發現這個異常沒辦法被捕捉。oh我一定是見了鬼了。
糾纏了一段時間,發現網上最多的解決方案是
在application標籤裡面新增一句android:hardwareAccelerated="false"(禁用硬體加速)
我不知道對多少人有用,我是真的沒有= =!

放下這個問題,喝杯熱茶發了會呆,仔細一想,發現DeadObjectException出現後程式並沒有crash掉,只是關於ble service的功能統統失去了響應,那麼問題應該出現在service裡,某個錯誤讓ble service 停止了,再結合錯誤發生在重新連線上,猜想是不是重新連線上的裝置並非是之前斷開的裝置(可別看不懂,我說的當然是指物件),也就是說,我在操作兩個不同的物件。
那麼我怎麼確保我斷開的和重連的一定是一個物件呢。
方法當然一大堆,不過我採用了比較省事的方式,單獨管理

新增了一個ListDataSave類,用來將斷開連線的裝置儲存下來,重新連線時只對這個類中存在的物件進行操作。問題終於解決了!!

解決方案很簡單明瞭了——新增管理類對不同狀態的裝置單獨管理。
前前後後花了不少時間,可能從來沒遇到過類似問題,慌了神了- -。

問題可能不一樣,但解題思想總是大同小異的,bug是無窮無盡,路還長啊

相關文章