Android 上的蓝牙:我的 Socket.connect() 永远阻塞,并且 Socket.close 不会解除阻塞
我已经在 Android 上开发蓝牙应用程序有一段时间了,我刚刚发现了这个问题。当我在蓝牙服务类中执行 mySocket.connect();
时,它偶尔会无限期地阻塞。我阅读了 BluetoothSocket.close()
的文档,内容如下:
立即关闭此套接字,并释放所有关联的资源。
立即导致其他线程中对此套接字的阻塞调用 抛出 IOException。
然而,这似乎对我不起作用。这是我设置计时器然后尝试连接的代码。
//code for starting timer and connecting
MyRunnable runner = new MyRunnable(mySocket);
Thread countThread = new Thread(runner);
countThread.start();
mySocket.connect();
runner.setSocketConnected();
//code for MyRunnable
private class MyRunnable implements Runnable{
private boolean didSocketConnect = false;
private boolean socketConnectFailed = false;
private BluetoothSocket socket;
public MyRunnable(BluetoothSocket socket){
this.socket = socket;
}
public void run() {
long start = System.currentTimeMillis();
while(ESTABLISH_TIMEOUT + start >= System.currentTimeMillis() && !didSocketConnect && !socketConnectFailed){
}
if(!didSocketConnect && !socketConnectFailed){
Log.v(TAG,"Reached Timeout and socket not open. Look for #");
try {
socket.close();
Log.v(TAG,"#THIS CALL SHOULD BE MADE AFTER REACHED TIMEOUT AND SOCKET NOT OPEN");
} catch (IOException e) {
Log.v(TAG,"Closing the socket connection fail--", e);
}
}else{
Log.v(TAG, "Connected or Failed Before Timeout Thread Hit");
}
}
public void setSocketConnected(){
didSocketConnect = true;
}
public void setSocketFailed(){
socketConnectFailed= true;
}
}
当我调用 close() 时,它也会无限期地阻塞,并且 connect() 调用永远不会抛出 IOException,尽管有 BluetoothSocket.close() 文档。使它工作的最佳方法是什么,以便 connect() 和 close() 不会无限期地阻塞?
注意:我在这个项目中使用 Android 2.2。
I have been working on a bluetooth app for android for awhile now and I just discovered this problem. When I preform mySocket.connect();
in my bluetooth service class it occasionally blocks indefinitely. I read the documentation for BluetoothSocket.close()
and it says the following:
Immediately close this socket, and release all associated resources.
Causes blocked calls on this socket in other threads to immediately
throw an IOException.
However, this does not seem to work for me. Here is my code for setting a timer and then trying to connect.
//code for starting timer and connecting
MyRunnable runner = new MyRunnable(mySocket);
Thread countThread = new Thread(runner);
countThread.start();
mySocket.connect();
runner.setSocketConnected();
//code for MyRunnable
private class MyRunnable implements Runnable{
private boolean didSocketConnect = false;
private boolean socketConnectFailed = false;
private BluetoothSocket socket;
public MyRunnable(BluetoothSocket socket){
this.socket = socket;
}
public void run() {
long start = System.currentTimeMillis();
while(ESTABLISH_TIMEOUT + start >= System.currentTimeMillis() && !didSocketConnect && !socketConnectFailed){
}
if(!didSocketConnect && !socketConnectFailed){
Log.v(TAG,"Reached Timeout and socket not open. Look for #");
try {
socket.close();
Log.v(TAG,"#THIS CALL SHOULD BE MADE AFTER REACHED TIMEOUT AND SOCKET NOT OPEN");
} catch (IOException e) {
Log.v(TAG,"Closing the socket connection fail--", e);
}
}else{
Log.v(TAG, "Connected or Failed Before Timeout Thread Hit");
}
}
public void setSocketConnected(){
didSocketConnect = true;
}
public void setSocketFailed(){
socketConnectFailed= true;
}
}
When I call close(), it also blocks indefinitely and the connect() call never throws an IOException, despite BluetoothSocket.close() documentation. What is the best way to make it work so that the connect() and close() do not block indefinitely?
NOTE: I am using Android 2.2 for this project.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
BluetoothSocket.connect() - 来自文档 :
为了让您对 BluetoothSocket.connect() 的调用退出阻塞,它需要建立连接。这是设计使然,如果您考虑一下,获取我们想要连接的蓝牙设备的地址,调用 .connect(),并阻塞直到其连接,这是有道理的。这就是为什么你需要单独的线程。
至于您调用 .close(),如果您解决了 .connect() 的问题,.close() 应该就位。
请阅读本文。它基本上表示您需要一个名为“连接”(.connect()) 和“已连接”(InputStream.read()) 的单独线程。这样你的 UI 就不会被阻塞。
示例(来自上面的链接)。 ConnectThread 启动连接。 ConnectedThread 管理连接(读/写数据等)。
BluetoothSocket.connect() - From the documentation:
In order for your call to BluetoothSocket.connect() to quit blocking, it needs to make the connection. This is by design and it makes sense if you think about it, get the address of the Bluetooth device we want to connect to, call .connect(), and block until its connected. This is why you want separate threads.
As far as you calling .close(), if you work out the issues with .connect(), .close() should fall into place.
Please read this. It basically says you want a separate thread called "connecting" (.connect()) and "connected" (InputStream.read()). This way your UI will not be blocked.
Example (from the above link). ConnectThread initiates the connection. ConnectedThread manages the connection (reads/writes data, etc...).