關於藍芽bluetooth開發中遇到的DeadObjectException異常
因為工作需要,做了一個有關藍芽裝置的專案,時間不長,層次也不深,相信你只需要一個對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()上。
DeadObjectException看到這個異常,就是字面意思嘛,某個物件掛了。
於是我打log、debug除錯,發現Gatt相關並沒有報空。在這之前並沒有遇到過這個異常,我試圖try住這個小麻煩,結果居然發現這個異常沒辦法被捕捉。oh我一定是見了鬼了。
糾纏了一段時間,發現網上最多的解決方案是
在application標籤裡面新增一句android:hardwareAccelerated="false"(禁用硬體加速)
我不知道對多少人有用,我是真的沒有= =!
放下這個問題,喝杯熱茶發了會呆,仔細一想,發現DeadObjectException出現後程式並沒有crash掉,只是關於ble service的功能統統失去了響應,那麼問題應該出現在service裡,某個錯誤讓ble service 停止了,再結合錯誤發生在重新連線上,猜想是不是重新連線上的裝置並非是之前斷開的裝置(可別看不懂,我說的當然是指物件),也就是說,我在操作兩個不同的物件。
那麼我怎麼確保我斷開的和重連的一定是一個物件呢。
方法當然一大堆,不過我採用了比較省事的方式,單獨管理
新增了一個ListDataSave類,用來將斷開連線的裝置儲存下來,重新連線時只對這個類中存在的物件進行操作。問題終於解決了!!
解決方案很簡單明瞭了——新增管理類對不同狀態的裝置單獨管理。
前前後後花了不少時間,可能從來沒遇到過類似問題,慌了神了- -。
問題可能不一樣,但解題思想總是大同小異的,bug是無窮無盡,路還長啊
相關文章
- iOS藍芽開發 Bluetooth藍芽CoreBluetooth 藍芽中心裝置的實現 藍芽外設的實現 有DemoiOS藍芽
- 五十一、【Bluetooth藍芽模組】藍芽模組
- 藍芽(Bluetooth)音訊協議藍芽音訊協議
- 藍芽Bluetooth技術小知識藍芽
- 關於專案中遇到的NullPointerException異常時處理手段NullException
- BLE藍芽那些事—深入瞭解Android藍芽Bluetooth基礎篇藍芽Android
- android bluetooth——藍芽的開啟、搜尋、配對與連線Android藍芽
- Android藍芽那點事——深入瞭解Android藍芽Bluetooth《進階篇》Android藍芽
- iOS藍芽開發iOS藍芽
- 深入瞭解Android藍芽Bluetooth——《基礎篇》Android藍芽
- win10如何開啟藍芽開關_win10怎麼開啟藍芽開關Win10藍芽
- Android 藍芽開發相關知識總結Android藍芽
- iOS 藍芽開發 - swift版iOS藍芽Swift
- Android開發--藍芽操作Android藍芽
- 微信小程式藍芽開發微信小程式藍芽
- 基於Neptune開發板的鍵盤藍芽模組DIY指南藍芽模組
- 鴻蒙系統應用開發之基於API6的藍芽開發鴻蒙API藍芽
- SpringBoot專案中遇到的異常Spring Boot
- win10藍芽開關不見了怎麼辦 win10藍芽開關在哪裡Win10藍芽
- Android BLE 藍芽開發——掃碼槍基於BLESSEDAndroid藍芽
- Android 傳統藍芽開發Android藍芽
- iOS 藍芽開發·基礎篇iOS藍芽
- Android 藍芽音響開發Android藍芽
- iOS藍芽4.0(BLE)開發(一)iOS藍芽
- 關於struts開發時遇到的問題
- iOS藍芽Mesh開發總結一iOS藍芽
- iOS藍芽Mesh開發總結二iOS藍芽
- React Native 藍芽4.0 BLE開發React Native藍芽
- Android藍芽開發流程實踐Android藍芽
- iOS藍芽4.0開發基礎教程iOS藍芽
- Android藍芽開發全面總結Android藍芽
- 安卓微信小程式開發之“藍芽”安卓微信小程式藍芽
- 前端開發中的Error以及異常捕獲前端Error
- nrf52832藍芽開發踩過的坑藍芽
- win10藍芽開關不見了怎麼辦 win10藍芽開關不見了解決方法Win10藍芽
- win10藍芽驅動不正常怎麼修復_win10藍芽驅動異常解決方法Win10藍芽
- 關於NoClassDefFoundError和ClassNotFoundException異常ErrorException
- win10系統中藍芽關閉瞭如何重新開啟Win10藍芽