如何在Android中为BLE快速稳定写入连续特性?

我正在 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()才会到来,直到前一个请求的完成回调触发.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...