在我的应用程序中,我在每个会话中打开并关闭同一设备上的蓝牙套接字并侦听数据。当我关闭一个时,我确保关闭输入和输出流,然后用cancel
方法插入。不过,对于某些人来说,该应用程序一直试图从设备上读取。我知道因为我在监听线程中读取来自run()
的日志,其中有一个用于监听的标志在cancel
中设置为false,并且监听线程将在套接字结束时结束由于IOException
而关闭,但这种情况从未发生过,因此仍必须打开套接字。即使这个人没有使用该应用程序,我也会看到每天每秒都尝试读取的日志。这可能是因为应用崩溃而且cancel
方法未被调用。无论哪种方式,我都无法保证将调用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()