我有一些有用的代码,但感觉就像一个坏主意。我想知道是否有更好的方法来做到这一点。
问题(老实说,你可以跳过这个并转到代码)
我有一个蓝牙LE应用程序偶尔需要尽可能快地将特性写入多个BLE设备(该应用程序是智能灯的控制器)。我目前为BLE通信设置的目的是使用一个处理所有通信的BluetoothContorller
自定义单例,以及要求控制器写入指示灯并移交Lamp
和BluetoothGatt
的{{1}}个对象。 {1}}到控制器。
解决方案
BluetoothGattCharacteristic
在我的gatt回调中:
handler.post(new Runnable() {
@Override
public void run() {
if (control != null) {
synchronized (BluetoothController.this) {
Logger.d("BluetoothController", "Waiting......");
for(int i = 0; i < 100; i++){
if(isWaiting)
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
else
break;
}
isWaiting = true;
Logger.d("BluetoothController", "Done waiting.");
}
control.setValue(message);
mBluetoothGatt.writeCharacteristic(control);
}
}
});
现在,这段代码有效,但我作为程序员的经验告诉我,这段代码会给我带来很多痛苦,肯定会有更好的。
编辑:使用Handler.Callback和消息的新代码
我已经使用Thread.wait()和notify()更改了我的代码以在句柄消息回调中进行等待,但似乎消息正在队列中备份,而最后一个消息执行似乎仍然是随机的。
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
if(isWaiting){
isWaiting = false;
}
}