我正在
Android开发BLE,我可以扫描,连接和写入特性到BLE设备.
当我点击按钮时,我调用以下功能将BluetoothGatt和特性传递给AsyncTask.
write_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new WriteCharacteristic(mBluetoothGatt,HueCharacteristic).execute(); } });
写特性代码如下:
private class WriteCharacteristic extends AsyncTask<String,Void,String> { public BluetoothGatt mGatt; public BluetoothGattCharacteristic mCharacteristic; public WriteCharacteristic(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic){ mGatt = gatt; mCharacteristic = characteristic; } @Override protected String doInBackground(String... urls) { mGatt.writeCharacteristic(mCharacteristic); return null; } }
但是我尝试点击按钮连续,似乎Android没有写入每个特征的BLE设备.
如果我连续点击5次按钮,会丢失1〜3次.它只向BLE设备写入两次特性.
题:
有没有更好的方式来编写Android的连续稳定的BLE设备?
解决方法
Android蓝牙堆栈中的读/写特性系统在排队多个操作方面并不好.您需要等待操作完成,然后再发送.此外,由于您的代码使用AsyncTask,您将在某些设备上并行执行任务,因此即使您重复按下按钮,请求也不会被序列化.
要从框架获得稳定的结果,您需要自己排队这些请求,并在发送下一个命令之前等待BluetoothGattCallback onCharacteristicWrite()触发.您的代码需要同步对GATT对象的所有访问,以便下一个writeCharacteristic()才会到来,直到前一个请求的完成回调触发.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。