0

標準の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;

ご覧のとおり、新しいスレッドを作成する前にスレッドを強制終了しようとしましたが、違いはありませんでした。助言がありますか?

4

1 に答える 1

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);ください。そうすれば、スレッドはその間に入らずに終了します。

于 2013-03-28T01:24:59.423 に答える