0
我正在编程一个蓝牙设备。我发现当我尝试断开连接时,该应用将挂起一些设备。安卓蓝牙如何断开连接而没有挂起
public class ConnectionThread extends Thread {
....
@Override
public void run() {
bReading = true;
while (bReading) {
try {
if (mInStream==null) break;
bytes = mInStream.read(buffer);
} catch (IOException e) {
cancel();
break;
}
}
}
public void cancel() {
bReading = false;
if (mInStream != null) {
try {
mInStream.close();
} catch (Exception e) {
e.printStackTrace();
}
mInStream = null;
}
所以我调用取消功能来停止while循环。 对于上面的逻辑,会有“线程死亡”事件,这是不好的。对于某些设备,“thead dead”事件甚至会导致应用程序挂起。
但是,我不知道上面的代码是什么错误。我不确定它是否导致了任何同步问题?如何改进流程以消除潜在的悬挂问题。任何形式的建议都非常感谢。谢谢。
我只需要关闭mmSocket,读取失败后不需要显式关闭mInStream发生?它似乎如果我不打电话mInStream.close(),一些Android手机不会正确释放资源,并需要重新启动手机再次估计连接。无论如何,我不知道处理断开连接事件的最正确方法,高度赞赏你的帮助。 – manhon 2015-02-09 16:56:03
mInStream是套接字的InputStream的引用。如果mInStream.read()失败,则意味着流被关闭或发生IOexception。在你的情况下,关闭这样做的套接字:“关闭对象并释放它所拥有的任何系统资源”,如果你看到Android源代码,你可以在close方法中看到这个“mSocket.shutdownInput();”如果你继续在源代码中看到这个方法会“关闭这个套接字的输入流”,所以当你关闭套接字时你不必自己关闭inputStream =) – 2015-02-09 17:23:46