Я уже некоторое время работаю над приложением bluetooth для android и только что обнаружил эту проблему. Когда я выполняю mySocket.connect ();
в моем классе обслуживания bluetooth, он иногда блокируется на неопределенный срок. Я прочитал документацию по 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 для этого проекта.