我修改了标准的Bluetoothchat示例,每半秒向蓝牙设备发送4个字节的数据。如果我开始App新鲜,它工作正常。但是,如果我重新连接如下,则会出现问题:
连接蓝牙时,我再次单击菜单上的连接按钮并选择相同的设备。这会断开蓝牙连接(不确定这是否是正确的断开程序)。然后,我通过选择设备再次连接,它将重新连接。重新连接后,出现一个非常奇怪的问题:它不是每半秒发送一次数据,而是每隔一刻发送一次数据。如果我再次完成该过程并重新连接,则时间间隔将变得更短。它达到了接收端的蓝牙设备无法跟上数据的程度。此时,唯一的出路是杀死应用程序并重新启动。然后一切都变得正常,直到下次我再次尝试重新连接。
我尝试了不同的东西,但似乎没有什么能解决这个问题。例如,我确保发送数据的线程在断开连接时被终止,因此没有多个线程正在发送数据。我想知道重新连接时波特率是否发生了变化,但是为什么波特率会影响Thread.sleep(500);声明(负责控制半秒数据发送)。任何帮助将不胜感激。
以下是代码,SendClass是在MainActivity下创建的:
class SendClass implements Runnable {
public void run() {
bytearr[0]=0;bytearr[1]=0;bytearr[2]=0;bytearr[3]=0;
while (!Thread.currentThread().isInterrupted()) {
if (mChatService==null || mChatService.getState()
!=BluetoothChatService.STATE_CONNECTED) {
continue;
} else {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mChatService.write(bytearr);
}
}//end of run
}//end of runnable
然后在STATE_CONNECTED下:
case BluetoothChatService.STATE_CONNECTED:
setStatus(getString(R.string.title_connected_to,mConnectedDeviceName));
/*
if(sendingThread!=null){
//sendingThread.stop();
sendingThread.interrupt();
if(D) Log.i(TAG, "after sendingThread");
sendingThread = null;
}*/
sendingThread = new Thread(new SendClass());
sendingThread.start();
break;
正如你所看到的,我试图在创建新线程之前杀死该线程,但这没有任何区别。有什么建议吗?
答案 0 :(得分:0)
即使在创建新线程并分配给特定线程不会停止运行的同一变量之后,您正在创建一个永远不会实际停止的线程。 您需要确保线程在断开连接后停止。 这是我的建议
将您的SendClass更改为:
class SendClass implements Runnable {
private boolean stopped = false;
public void setStopped(boolean s){
this.stopped = s;
}
public void run() {
bytearr[0]=0;bytearr[1]=0;bytearr[2]=0;bytearr[3]=0;
while (!Thread.currentThread().isInterrupted() && !stopped) {
if (mChatService==null || mChatService.getState() !=BluetoothChatService.STATE_CONNECTED) {
continue;
} else {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mChatService.write(bytearr);
}
}//end of run
}//end of runnable
然后当你开始你的线程时保留对Runnable的引用,这样你就可以像这样调用setStopped(true);
SendClass sc = new SendClass();
sendingThread = new Thread(sc);
sendingThread.start();
当你断开蓝牙连接时,不要忘记拨打sc.setStopped(true);
,这样你的线程就会在不进入的时候完成。