He estado trabajando en una aplicación bluetooth para Android por un tiempo y acabo de descubrir este problema. Cuando preformas mySocket.connect();
en mi clase de servicio bluetooth ocasionalmente bloquea de forma indefinida. Leí la documentación para BluetoothSocket.close()
y dice lo siguiente:Bluetooth en Android: mi Socket.connect() Bloquea para siempre, y Socket.close no desbloquea
Cierre inmediatamente este conector y libere todos los recursos asociados.
Causa las llamadas bloqueadas en este socket en otros hilos para inmediatamente lanzar una IOException.
Sin embargo, esto no parece funcionar para mí. Aquí está mi código para configurar un temporizador y luego tratar de conectarme.
//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;
}
}
Cuando llamo a close(), que también bloquea indefinidamente y el() llamada connect nunca tira una IOException, a pesar de la documentación BluetoothSocket.close(). ¿Cuál es la mejor manera de hacerlo funcionar para que connect() y close() no se bloqueen indefinidamente?
NOTA: Estoy usando Android 2.2 para este proyecto.
¿Alguna vez encontró la causa/solución a este problema? Me encuentro con lo mismo, pero estoy usando dos hilos, un hilo de conexión y otro que se llama close(). –
Tengo el mismo problema aquí. Mainthread llama cerca y nunca regresa, pero no siempre, a veces funciona, a veces no funciona. – NikkyD