我使用了AndroID 4.2的三星BLE堆栈,它工作正常,即使稳定性可能更好.
现在有4.3,对于每个客户端连接,我们有一个BluetoothGatt类的实例.
也就是说,我通过呼叫连接到BLE设备
BluetoothGatt gatt = device.connectGatt(this,true,callbacks);
这些BluetoothGatt对象是用于实际与设备交互的对象.
由于我想连接到多个设备并与之交互,我将HashMap中的BluetoothGatt实例缓存定义为我的服务的私有属性:
private HashMap<String,BluetoothGatt> devicesGatts = new HashMap<String,BluetoothGatt>();
密钥是设备地址.
然后,每当我想要连接到设备时,我都会从这个HashMap中拉出BluetoothGatt实例:
public BluetoothGatt connectGatt(final BluetoothDevice device){ if(device == null){ return null; } String adr = device.getAddress(); BluetoothGatt gatt = devicesGatts.get(adr); if(gatt == null){ gatt = device.connectGatt(this,mGattCallbacks); } else { BluetoothDevice gattDevice = gatt.getDevice(); if(gattDevice != null && adr.equals(gattDevice.getAddress())){ gatt.connect(); // PROBLEM APPEARS HERE } else { gatt = device.connectGatt(this,mGattCallbacks); } } devicesGatts.put(adr,gatt); return gatt;}
问题是,有时,如果设备尝试通过调用gatt.connect()通过其缓存的BluetoothGatt实例重新连接,我会收到一个名为DeadobjectException的错误(不是致命).
当我暂停应用程序并重新启动蓝牙芯片,然后恢复应用程序时,就会发生这种情况.
在发生这种情况之后我不能使用缓存实例,我并不感到惊讶,但我想知道如何捕获该异常或在它发生之前检测它.
这是堆栈跟踪:
02-18 10:43:51.884: E/BluetoothGatt(23312): androID.os.DeadobjectException02-18 10:43:51.884: E/BluetoothGatt(23312): at androID.os.BinderProxy.transact(Native Method)02-18 10:43:51.884: E/BluetoothGatt(23312): at androID.bluetooth.IBluetoothGatt$Stub$Proxy.clIEntConnect(IBluetoothGatt.java:841)02-18 10:43:51.884: E/BluetoothGatt(23312): at androID.bluetooth.BluetoothGatt.connect(BluetoothGatt.java:759)02-18 10:43:51.884: E/BluetoothGatt(23312): at MYSERVICE.connectGatt(...)
异常是由本机方法引发的,但蓝牙堆栈类不会引发异常.
我怎么能抓到它?
解决方法 我找到了一个解决方法.我只是在蓝牙芯片关闭时重置HashMap.
IntentFilter filter = new IntentFilter();filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);this.registerReceiver(bluetoothStatusChangeReceiver,filter);private final broadcastReceiver bluetoothStatusChangeReceiver= new broadcastReceiver() { public voID onReceive(Context context,Intent intent) { String action = intent.getAction(); if(action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)){ if(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1) == BluetoothAdapter.STATE_OFF){ devicesGatts.clear(); resetBluetooth(); } else if(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1) == BluetoothAdapter.STATE_ON){ initBluetooth(); } } }}
函数initBluetooth和resetBluetooth允许我重置BluetoothGattServer和BluetoothManager实例.
总结以上是内存溢出为你收集整理的在Android 4.3蓝牙BLE上重置蓝牙芯片后调用BluetoothGatt.connect()时引发了DeadObjectException全部内容,希望文章能够帮你解决在Android 4.3蓝牙BLE上重置蓝牙芯片后调用BluetoothGatt.connect()时引发了DeadObjectException所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)