Я изменил стандартный пример Bluetoothchat, чтобы отправлять 4 байта данных за раз на устройство Bluetooth каждые полсекунды. Он отлично работает, если я запускаю приложение заново. Однако возникает проблема, если я повторно подключаюсь следующим образом:
Пока Bluetooth подключен, я снова нажимаю кнопку подключения в меню и выбираю то же устройство. Это отключает bluetooth (не уверен, что это правильная процедура отключения). Затем я снова подключаюсь, выбрав устройство, и оно будет снова подключено. После переподключения появляется очень странная проблема: вместо того, чтобы отправлять данные каждые полсекунды, он будет отправлять данные каждые четверть секунды. Если я пройду процесс еще раз и переподключусь, временной интервал станет еще короче. Доходит до того, что устройство Bluetooth на принимающей стороне не справляется с данными. На данный момент единственный выход — убить приложение и перезапустить его снова. Потом все становится нормально, пока в следующий раз не попытаюсь снова подключиться.
Я пробовал разные вещи, но ничто не могло исправить это. Например, я убедился, что поток, отправляющий данные, уничтожается при отключении, поэтому несколько потоков не отправляют данные. Мне было интересно, изменилась ли скорость передачи данных при повторном подключении, но тогда почему скорость передачи данных влияет на 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;
Как видите, я пытался убить ветку перед созданием новой, но это не имело никакого значения. Какие-либо предложения?