關(guān)于藍牙bluetooth開發(fā)中遇到的DeadObjectException異常

因為工作需要,做了一個有關(guān)藍牙設(shè)備的項目,時間不長,層次也不深,相信你只需要一個對BLE稍稍有些了解,再加上一款方便的框架,就能完成簡單的開發(fā)(想做不簡單的,那是框架能滿足的嗎??)。這里推薦一個,讓你不至于去滿世界找

Android BLE基礎(chǔ)操作框架,基于回調(diào),操作簡單。包含掃描、多連接、廣播包解析、服務(wù)讀寫及通知等功能。

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

大多數(shù)的BLE相關(guān)項目,都會需要讀取信號強度、設(shè)備電量、連接及重新連接等等一些功能,我遇到DeadObjectException,出現(xiàn)在重連之后讀取信號強度上。也許你遇到這個異常的情況和我不一樣,也許依然會有所幫助。

 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的代碼,而我的問題出現(xiàn)在 gatt.readRemoteRssi()上。


DeadObjectException.png

DeadObjectException看到這個異常,就是字面意思嘛,某個對象掛了。
于是我打log、debug調(diào)試,發(fā)現(xiàn)Gatt相關(guān)并沒有報空。在這之前并沒有遇到過這個異常,我試圖try住這個小麻煩,結(jié)果居然發(fā)現(xiàn)這個異常沒辦法被捕捉。oh我一定是見了鬼了。
糾纏了一段時間,發(fā)現(xiàn)網(wǎng)上最多的解決方案是
在application標(biāo)簽里面添加一句android:hardwareAccelerated="false"(禁用硬件加速)
我不知道對多少人有用,我是真的沒有= =!

放下這個問題,喝杯熱茶發(fā)了會呆,仔細一想,發(fā)現(xiàn)DeadObjectException出現(xiàn)后程序并沒有crash掉,只是關(guān)于ble service的功能統(tǒng)統(tǒng)失去了響應(yīng),那么問題應(yīng)該出現(xiàn)在service里,某個錯誤讓ble service 停止了,再結(jié)合錯誤發(fā)生在重新連接上,猜想是不是重新連接上的設(shè)備并非是之前斷開的設(shè)備(可別看不懂,我說的當(dāng)然是指對象),也就是說,我在操作兩個不同的對象。
那么我怎么確保我斷開的和重連的一定是一個對象呢。
方法當(dāng)然一大堆,不過我采用了比較省事的方式,單獨管理

新增了一個ListDataSave類,用來將斷開連接的設(shè)備保存下來,重新連接時只對這個類中存在的對象進行操作。問題終于解決了!!

解決方案很簡單明了了——新增管理類對不同狀態(tài)的設(shè)備單獨管理。
前前后后花了不少時間,可能從來沒遇到過類似問題,慌了神了- -。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容