Bluetooth На Android: мой Socket.connect () блокирует навсегда, а Socket.close не разблокирует

Я уже некоторое время работаю над приложением 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 для этого проекта.

7
задан Joshua Abrams 23 September 2011 в 13:56
поделиться