標準のBluetoothchatの例を変更して、一度に4バイトのデータをBluetoothデバイスに0.5秒ごとに送信しました。アプリを新しく起動すると正常に動作します。ただし、次のように再接続すると問題が発生します。
Bluetoothが接続されているときに、メニューの接続ボタンをもう一度クリックして、同じデバイスを選択します。これにより、Bluetoothが切断されます(これが切断する正しい手順かどうかはわかりません)。その後、デバイスを選択して再度接続すると、再接続されます。再接続後、非常に奇妙な問題が発生します。0.5秒ごとにデータを送信する代わりに、1/4秒ごとにデータを送信します。もう一度プロセスを繰り返して再接続すると、時間間隔がさらに短くなります。受信側のBluetoothデバイスがデータに追いつけない状態になります。この時点で、唯一の解決策はアプリを強制終了して再起動することです。その後、すべてが正常になり、次に再接続を試みるまでです。
私はさまざまなことを試しましたが、これを修正するものは何もありません。たとえば、データを送信しているスレッドが切断されたときに強制終了されるようにして、複数のスレッドがデータを送信しないようにしました。再接続時にボーレートが変化するかどうか疑問に思っていましたが、なぜボーレートがThread.sleep(500)に影響するのでしょうか。ステートメント(0.5秒のデータ送信を制御する責任があります)。どんな助けでも大歓迎です。
コードは次のとおりです。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;
ご覧のとおり、新しいスレッドを作成する前にスレッドを強制終了しようとしましたが、違いはありませんでした。助言がありますか?