拼图:每次重新连接后蓝牙数据发送间隔缩短一半

时间:2013-03-23 23:15:20

标签: android bluetooth reconnect

我修改了标准的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;

正如你所看到的,我试图在创建新线程之前杀死该线程,但这没有任何区别。有什么建议吗?

1 个答案:

答案 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);,这样你的线程就会在不进入的时候完成。