Напишите outputstream после чтения Bluetooth socket android

Я хочу писать после чтения с устройства (через разъем Bluetooth )
Проблема в том, что while(true) заканчивает, когда сокет закрыт, поэтому я не могу писать снова.

Это код:

        try {
            // This will block until it succeeds in connecting to the device
            // through the bluetoothSocket or throws an exception
            bluetoothSocket.connect();
            try {
                connectingThread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            outstream = bluetoothSocket.getOutputStream();
            outstream.write("P".getBytes());
            instream = bluetoothSocket.getInputStream();
            byte[] buffer = new byte[128];  // buffer store for the stream
            int bytes; // bytes returned from read()
            String readMessage = "";

             // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = instream.read(buffer);
                    if(bytes!= -1){
                    // Send the obtained bytes to the UI activity
                    readMessage = new String(buffer, 0, bytes);

                    arrayList.add(readMessage);
                    biodyMsg = TextUtils.join("", arrayList);
                    }

                } catch (Exception e) {

                    Log.d("Read Error", e.toString());

                }finally {
                    outstream = bluetoothSocket.getOutputStream();
                    outstream.write("F".getBytes());
                }
                break;
            }

        } catch (IOException connectException) {
            connectException.printStackTrace();
            try {    
                bluetoothSocket.close();
            } catch (IOException closeException) {
                closeException.printStackTrace();
            }
        }

Logcat

Вы можете помочь мне

1 ответ

  1. Единственный способwhile (true), которым цикл может завершиться, — это с помощью breakинструкции или путем получения необнаруженного исключения, и вы не упомянули о его получении. В этом коде возможны два исключения:

    • IOException: но единственный способ, которым вы можете получить IOExceptionс этим кодом, — это если узел сбрасывает соединение.
    • ArrayIndexOutOfBoundsException при построенииString, если bytesотрицательно, что это может быть: смотрите ниже; но вы не упоминали об этом.

    Ваша фактическая проблема заключается в том, что вы не проверяете bytesдля -1, который указывал бы конец потока, который в свою очередь указывал бы, что узел закрыл соединение, которое в свою очередь указывает, что вы должны закрыть сокет и вырваться из цикла чтения.