【问题标题】:proper way to close BluetoothSocket关闭蓝牙套接字的正确方法
【发布时间】:2017-04-11 01:06:27
【问题描述】:

我以这种方式创建了gpsSocket

final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
final BluetoothDevice gpsDevice = bluetoothAdapter.getRemoteDevice(bluetoothAddr);
gpsSocket = gpsDevice.createRfcommSocketToServiceRecord(RFCOMM_UUID);
                gpsSocket.connect();

为了简单起见,我删除了错误处理。

之后我设置了一些东西以开始使用套接字:

final InputStream in = gpsSocket.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(in, "US-ASCII"));

如果我在读取reader 的过程中发现异常,我应该关闭reader, 或gpsSocket,或两者兼而有之?

【问题讨论】:

    标签: java android


    【解决方案1】:

    根据经验,您应该始终注意关闭对象,即Closeables。

    BluetoothSocketBufferedReader 都实现了Closeable 接口,这意味着一旦你完成了该对象,你应该通过调用close() 来处理它们,否则你最终会得到内存泄漏。

    结构应该是这样的:

    BufferedReader reader;
    
    try {
        reader = ... // initialization
    } catch (some exception) {
        ...
    } finally {
        if (reader != null) {
            reader.close();
        }
    }
    

    我应该关闭 readergpsSocket 还是同时关闭它们?

    您当然应该关闭reader。如果你不再需要gpsSocket,那么你也应该关闭它。但正如在documentation of BluetoothSocket.close() 中看到的那样:

    如果流已经关闭,则调用此方法无效。

    【讨论】:

    • 但是根据这个:stackoverflow.com/questions/3956163/…关闭流是关闭套接字,所以socket.close()将是无操作的,如果在stream.close()之前调用,或者引发异常,或者这不相关回答,是因为BluetoothSocket与其他socket不同?
    • 嗯,它可能会关闭,但你为什么要依赖它呢?作为一个遵纪守法的公民,您负责创建一个Closeable 对象,并注意处理它。归根结底,BluetoothSocket 可能还有其他一些需要处理的物品,但你不给他机会。
    • 参见here如果流已关闭,则调用此方法无效。文档规定,您无需显式关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2019-12-11
    • 2014-03-27
    相关资源
    最近更新 更多