在我的应用程序中,我在每个会话中打开和关闭同一设备上的蓝牙套接字并监听数据。当我关闭一个时,我确保关闭输入和输出流,然后在一个cancel
方法中进行套接字。尽管如此,对于某些人来说,该应用程序仍在尝试从设备中读取数据。我知道是因为我读取了来自run()
侦听线程中的日志,其中有一个侦听标志设置为 false in cancel
,并且侦听线程将在套接字因 关闭而结束时结束IOException
,但这永远不会发生,所以套接字仍然必须打开。即使该人没有使用该应用程序,我也会每天每秒看到尝试读取的日志。这可能是因为应用程序崩溃并且cancel
方法没有被调用。无论哪种方式,我都不能保证会调用取消方法。如果这些都是在独立创建的新线程中打开的,我如何关闭以前在启动我的应用程序时打开的任何蓝牙套接字?
这家伙有同样的问题,但我没有看到任何解决方案: Android bluetooth connection doesn't close after application crash
接受的答案不好,因为:
当前用户
UncaughtExceptionHandler
尚未运行该代码,并且他们需要在新版本发布时关闭任何以前的连接必须有对套接字的
UncaughtExceptionHandler
引用,而它没有。我希望能够在应用程序启动时关闭任何蓝牙套接字。提出这个问题的人询问如何获取有关套接字的信息,以便在应用程序启动并且您想关闭它们时存储,但没有得到回应。
编辑:
我如何打开套接字(删除了日志记录代码):
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()