java - Android 蓝牙 IOException 错误的文件号

标签 java android bluetooth

我有一个接收线程正在监听 BluetoothServerSocket accept() 调用。这个线程会很频繁地被另一个线程杀死并重新启动。当它收到 kill 信号时,它会关闭 BluetoothServerSocket,从而在 accept() 中引发 IOException,并退出无限循环。但偶尔,在这些启动和重新启动期间,listenUsingRfcommWithServiceRecord() 调用会捕获“错误文件编号”IOException 并过早退出循环。我想我可能没有在 kill(?) 中正确关闭 BT 组件,但还没有弄清楚任何事情......有人可以给我一些指示吗?

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);
    }
}

最佳答案

如果有人感兴趣……我发现这只发生在某些手机上。在大约 20-30 次停止和启动循环后,我可以在我的三星 Galaxy S 上始终如一地重现这一点。很多时候,我也会从 bluez 中捕获到“内存不足”,这导致我发现问题存在于 api 之下......我无法在 Droid X、HTC G2 或 myTouch 4G 上重现此问题。

关于java - Android 蓝牙 IOException 错误的文件号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872212/

相关文章:

android - 在线广告的类型有什么区别?

linux - Bluez-5.36 StartDiscovery() 方法

java - 无法与 ELM327 蓝牙通信

Java - 如何将参数传递给 if 语句 "if "F(x )"found, pass "x"到 F 函数

java - 在什么场景下我们使用Thread.getContextClassLoader() 和ClassLoader.getSystemClassLoader() 可以代替呢?

java - 即时向 Java 8 并行流添加元素

python - 从蓝牙设备获取响应

java - 我无法运行 JAR 文件?

android - 如何在第二台设备上恢复购买(INAPP 和 SUBS)

java - 如何在另一个 Activity 或主类的 Activity 中调用处理程序