我有一个接收线程正在监听 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/