DataInputStream застрял на чтение полностью - PullRequest
0 голосов
/ 01 октября 2011

У меня есть BluetoothSocket, с которого я читаю данные, используя отдельный процесс Thread из GUI. Я обертываю InputStream в DataInputStream, чтобы можно было использовать readFully (..) для ожидания указанного объема данных. Я могу запустить этот код в течение часа, а затем программа блокируется, и когда я отлаживаю, она застряла в readFully (). Я включил в свой поток GUI BroadcastReceivers, чтобы уведомлять меня, когда Bluetooth отключается. 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) {}
        }
    }
}

1 Ответ

1 голос
/ 02 ноября 2011

Я больше не получаю эту ошибку, делая это изящно при обнаружении отключения Bluetooth.

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

, а затем выполните проверку, просматривая поступающие данные и, если размер буфера не увеличивается, также вызовите отключение.

...