0

私のアプリケーションでは、2 つのデバイスが Bluetooth 経由で接続されています。バックグラウンドで、Bluetooth 接続用の独自のスレッドを実行します。(のように)あるデバイスが別のデバイスに接続したいときに、2番目のデバイスにリクエストダイアログを表示したい。したがって、AcceptThread を変更する必要があると思います。AcceptThread は、mainThread に通知する必要があります (たとえば、Handler を使用)。

AcceptThread には、次のコードがあります。

                // This is a blocking call and will only return on a
                // successful connection or an exception
                socket = mmServerSocket.accept();

ここに私の問題があります。この「ブロッキングコール」は常に実行されます。別のデバイスが接続を希望していることを mainThread にいつ、どのように通知する必要がありますか?

4

1 に答える 1

0

後は必ず。あなたが望むのは、ブロッキング呼び出しの結果です - の.accept()。それはあなたのコードのソケットです。

Android BluetoothServerSocket ドキュメントからの引用は次のとおりです。

次に、accept() を呼び出して、着信接続要求をリッスンします。この呼び出しは、接続が確立されるまでブロックされます。確立された時点で、接続を管理するために BluetoothSocket が返されます。BluetoothSocket が取得されたら、接続を受け入れる必要がなくなったら、BluetoothServerSocket で close() を呼び出すことをお勧めします。BluetoothServerSocket を閉じても、返された BluetoothSocket は閉じません。

したがって、次のことを忘れないでください。

 mmServerSocket.close()

ソケット (実際にはBluetoothSocket )を正しく受け取ったら、ユーザーの選択に従って、それをどうするかを選択できます。

  • 彼が先に進む必要がある場合は、AsyncTask がキャンセルされるか、例外が発生するまで (おそらく Bluetooth 切断時)、ソケットから読み取る AsyncTask を作成するだけです。
  • 彼が拒否した場合は、ソケットをキャンセルするだけです

ブロッキング コール中に例外が発生した場合、何かが失敗したことを示すトーストだけがメイン メニューに戻ります。ただし、ダイアログを実行することはできます (再試行など)。

于 2012-10-31T13:59:30.150 に答える