Android Bluetooth IOException неверный номер файла - PullRequest
2 голосов
/ 15 января 2012

У меня есть принимающий поток, прослушивающий вызов BluetoothServerSocket accept (). Этот поток будет убит и перезапущен другим потоком довольно часто. Когда он получает сигнал уничтожения, он закрывает BluetoothServerSocket, вызывая IOException в accept (), и выходит из бесконечного цикла. Но иногда во время этих запусков и перезапусков вызов listenUsingRfcommWithServiceRecord () перехватывает IOException «неверный номер файла» и преждевременно завершает цикл. Я думаю, что я не могу корректно завершить работу компонента BT в kill (?), Но пока ничего не понял ... Может кто-нибудь дать мне несколько советов?

private class ReceiveThread extends Thread {
    private final static String TAG = "ReceiveThread";
    private BluetoothServerSocket mmBtServer;
    private BluetoothSocket mmBtSocket;

    public ReceiveThread() {
        setName(TAG);
    }

    public void run() {
        if(D) Log.d(TAG,"RceiveThread running");

        while(true) {
            try {
                SetState(SERVICE_STATE.LISTENING);
                mmBtServer = mBtAdapter.listenUsingRfcommWithServiceRecord(mAppName, mUUID);

                if(D) Log.d(TAG,"ReceiveThd accepting connection");
                mmBtSocket = mmBtServer.accept();
                // Close server once socket establishes
                mmBtServer.close();

                if(D) Log.d(TAG, "Connection Established");
                SetState(SERVICE_STATE.CONNECTED_BUSY);



                /** Handle Processing **/



                // Close socket
                mmBtSocket.close();
            } catch (IOException e) {
                SetState(SERVICE_STATE.NOT_CONNECTED);
                Log.d(TAG,"IOException in ReceiveThread", e);
                break;
            }

            SetState(SERVICE_STATE.CONNECTED_IDLE);
        }
    }

    public void kill() {
        try {
            if(mmBtSocket!=null) mmBtSocket.close();
            if(mmBtServer!=null) mmBtServer.close();
        } catch (IOException e) {
            Log.d(TAG,"Failure killing ReceiveThread", e);
        }
        SetState(SERVICE_STATE.NOT_CONNECTED);
    }
}

1 Ответ

2 голосов
/ 08 февраля 2012

Если кому-то интересно .. Я обнаружил, что это происходит только на определенных телефонах. Я могу последовательно воспроизвести это на своем Samsung Galaxy S после примерно 20-30 циклов остановок и запусков. Довольно часто я также обнаруживаю «нехватку памяти» от bluez, что приводит меня к проблеме, находящейся под API ... Я не могу воспроизвести это на Droid X, HTC G2 или myTouch 4G.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...