我正在使用蓝牙聊天应用程序代码在两个Android设备之间传输数据。 但是代码正在发送连锁数据。 例如:当我尝试发送如下数据时:
有时以这种形式发送数据:
以下是我发送数据的编写代码:
public synchronized void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
mHandler.obtainMessage(BluetoothHelper.MESSAGE_WRITE, -1, -1, buffer)
.sendToTarget();
mmOutStream.flush();
} catch (IOException e) {
Log.e(TAG, "Exception during write", e);
}
}
我的阅读代码也是:
if (mmInStream.available()>0){
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(BluetoothHelper.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
}else {
SystemClock.sleep(100);
}
我尝试了冲洗和睡眠,但他们没有解决问题。请帮忙。
答案 0 :(得分:1)
由于两个不同线程的执行速度不同,正在进行串联。
一个是UI线程(您的Android应用程序),即正在查看通过蓝牙接收的数据的位置。 UI线程刷新是通过以下行。
mHandler.obtainMessage(BluetoothHelper.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
第二个线程是收集通过蓝牙链接接收的数据的线程。通过蓝牙接收数据的代码是:
mmInStream.read(buffer);
这是一个阻止呼叫,即仅在通过蓝牙接收到某些内容时返回。
UI线程比通过蓝牙线程接收的数据相对缓慢地刷新视图。这意味着下次刷新UI视图时,BT读取线程上可能已经收到多个字符。因此,似乎数据连接在一起。这个连接将是随机的,并且随机数字符串连接。
要解决此问题:
1)发送时:发送字符(或数据包),后跟分隔符。
2)接收时:只有在收到接收到分隔符的字符(或数据包)之后才将消息发送到UI。这意味着每次阻塞调用mmOutStream.write(buffer)返回后,你必须累积接收字符并验证这些累积的缓冲区。