0

在我的应用程序中,我在每个会话中打开和关闭同一设备上的蓝牙套接字并监听数据。当我关闭一个时,我确保关闭输入和输出流,然后在一个cancel方法中进行套接字。尽管如此,对于某些人来说,该应用程序仍在尝试从设备中读取数据。我知道是因为我读取了来自run()侦听线程中的日志,其中有一个侦听标志设置为 false in cancel,并且侦听线程将在套接字因 关闭而结束时结束IOException,但这永远不会发生,所以套接字仍然必须打开。即使该人没有使用该应用程序,我也会每天每秒看到尝试读取的日志。这可能是因为应用程序崩溃并且cancel方法没有被调用。无论哪种方式,我都不能保证会调用取消方法。如果这些都是在独立创建的新线程中打开的,我如何关闭以前在启动我的应用程序时打开的任何蓝牙套接字?

这家伙有同样的问题,但我没有看到任何解决方案: Android bluetooth connection doesn't close after application crash

接受的答案不好,因为:

  1. 当前用户UncaughtExceptionHandler尚未运行该代码,并且他们需要在新版本发布时关闭任何以前的连接

  2. 必须有对套接字的UncaughtExceptionHandler引用,而它没有。我希望能够在应用程序启动时关闭任何蓝牙套接字。

  3. 提出这个问题的人询问如何获取有关套接字的信息,以便在应用程序启动并且您想关闭它们时存储,但没有得到回应。

编辑:

我如何打开套接字(删除了日志记录代码):

        try {
            tmp.connect();;
        } catch (IOException e) {
            isConnected = false;
                try {
                    tmp = (BluetoothSocket) device.getClass().getMethod("createRfcommSocket",
                            new Class[] {int.class}).invoke(device, 1);
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
                try {
                    tmp.connect();
                    setConnected();
                } catch (IOException e1) {
                    e1.printStackTrace();
                    isConnected = false;
                    cancel();
                }

我如何关闭套接字:

    public void cancel() {

        isConnected = false;
        listening = false;
        try {
            if (manageConnection.mmInStream != null) {
                manageConnection.mmInStream.close();
                manageConnection.mmInStream = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            if (manageConnection.mmOutStream != null) {
                manageConnection.mmOutStream.close();
                manageConnection.mmOutStream = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            mmSocket.close();
            mmSocket = null;
            manageConnection = null;
        } catch (IOException e) {
              // Logging code
        }
    }
}

听力:

        while (listening == true) {
            try {

                synchronized (ListeningActivity.lock) {
                    buffer = new byte[mmInStream.available()];

                    mmInStream.read(buffer);
....

            } catch (IOException e) {
                // Code that calls cancel()
4

0 回答 0