0

GUIとは別のスレッドプロセスを使用して、データを読み取っているBluetoothSocketがあります。InputStreamをDataInputStreamでラップして、readFully(..)を使用して指定された量のデータを待機できるようにします。このコードを約1時間実行すると、プログラムがロックされ、デバッグ時にreadFully()でスタックします。Bluetoothが切断されたときに通知するようにGUIスレッドBroadcastReceiversに含めました。BroadCastReceiversに通知が届くことはありません。その場合、デバイスがデータの送信を停止する理由がわからないか、Bluetooth SPPがドロップされてもソケットが開いたままであるため、Bluetooth切断メッセージが表示されないかどうかはわかりません。修正に関するアイデア、またはなぜまたはどのようにデバッグするのかについてのアイデアをいただければ幸いです。

これが私のReadBlueToothクラスです...

public class ReadBlueToothData extends Thread {
    private BluetoothSocket btSocket;
    private BluetoothAdapter bta;
    private DataInputStream dinput;

    public ReadBlueToothData(Activity a,String mac) {
       ...init object...
    }

    public void run() {
        // if socket connected otherwise stop
        if (dinput==null) return;

        byte[] byteArray = new byte[3];


        while (!Thread.interrupted()) {

            dinput.readFully(byteArray, 0, 3);

            // DO something ....
        }

        // close out InputStream nicely
        if (dinput!=null) {
            try {
                dinput.close();

            } catch (IOException e) {   }
        }

        if (btSocket != null) {
            try {
                btSocket.close();
            } catch (IOException e) {}
        }
    }
}
4

1 に答える 1

1

Bluetoothの切断を検出するときにこれを適切に実行しても、このエラーは発生しなくなりました。

dinput.close();
readBlueToothData().interrupt();
btSocket.close();
//make sure to check for nulls for all these too

また、入ってくるデータを見てチェックを行い、バッファのサイズが増えない場合は、disconnectも呼び出します。

于 2011-11-01T23:00:07.147 に答える