2
我有一个接收线程使用BluetoothServerSocket accept()调用进行侦听。这个线程会被另一个线程杀死并重新启动。当它获得kill信号时,它关闭BluetoothServerSocket,因此在accept()中引发一个IOException异常,并从无限循环中退出。但偶尔,在这些启动和重新启动过程中,listenUsingRfcommWithServiceRecord()调用将捕获“坏文件编号”IOException,并提前退出循环。我想我可能不会在kill(?)中正确关闭BT组件,但还没有弄清楚什么......有人能给我一些指示吗?Android蓝牙IOException坏文件编号
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);
}
}
三星Galaxy S上的相同问题无法在其他设备上重现。这是什么意思? – Saasha 2012-02-08 10:44:30
很高兴你能重现。 Prolly只是意味着三星没有做好整合BT的工作。 – broody 2012-02-08 15:26:23
我在2.3.3版本中看到Galaxy Tab GT-P1000(原版)的相同症状。我的应用做了一个bluetoothsocket连接,它连接到一个远程设备,但连接调用永远不会返回,最终我必须终止进程。在我的下一次运行中,我遇到了你观察到的问题。所以,问题的根源在于连接(对我而言)。 – Tom 2012-04-21 15:45:40