1

我正在尝试尽可能优雅地断开与我的蓝牙设备的连接,但 Android 坚持向我抛出系统错误:

09-02 15:16:16.748: W/System.err(31038): java.io.IOException: Operation Canceled
09-02 15:16:16.748: W/System.err(31038):    at android.bluetooth.BluetoothSocket.readNative(Native Method)
09-02 15:16:16.748: W/System.err(31038):    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:333)
09-02 15:16:16.748: W/System.err(31038):    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:60)
09-02 15:16:16.748: W/System.err(31038):    at com.bluetooth.BluetoothRemoteControlApp$ConnectedThread.run(BluetoothRemoteControlApp.java:207)

我正在使用 BluetoothChat 示例程序的修改版本,我的连接线程如下所示:

private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;

        connected = true;
    }

    public void run() {
        byte[] buffer = new byte[1024];
        int bytes;
        byte ch;

        while(connected) {
            try {
                bytes = 0;
                while((ch = (byte) mmInStream.read()) != '\n')
                {
                    buffer[bytes++] = ch;
                }

                busy = false;

                String msg = new String(buffer, "UTF-8").substring(0, bytes - 1);

                Log.d(TAG, "Read: " + msg);

                if(activityHandler != null) {
                    activityHandler.obtainMessage(BT_READ, bytes, 0, msg).sendToTarget();
                }

            }
            catch(IOException e) {
                //e.printStackTrace();
                Log.w(TAG, "Cancelling");
                break;
            }
        }
    }

    public void write(byte[] buffer) {
        // . . .
    }

    public void cancel() {
        Log.i(TAG, "Cancelling connected thread");
        try {
            mmSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在断开连接期间,我调用了引发系统错误的取消方法。我应该担心并尝试解决它吗?我真的不喜欢在我的日志上看到错误...

4

2 回答 2

1

我认为你不应该太担心这个日志,因为你正在取消并且日志本身说Operation Cancelled

我认为您正在运行方法中使用 e.printStacktrace 打印日志。这就是您看到此日志的原因。

于 2012-09-02T14:13:19.943 回答
0

也许您应该在取消方法中将 connected 设置为 false。

于 2013-03-08T12:09:56.833 回答