因为工作需要,做了一个有关蓝牙设备的项目,时间不长,层次也不深,相信你只需要一个对BLE稍稍有些了解,再加上一款方便的框架,就能完成简单的开发(想做不简单的,那是框架能满足的吗??)。这里推荐一个,让你不至于去满世界找
https://github.com/xiaoyaoyou1212/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是无穷无尽,路还长啊
共同学习,写下你的评论
评论加载中...
作者其他优质文章