2012-01-15 30 views
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); 
    } 
} 
+0

三星Galaxy S上的相同问题无法在其他设备上重现。这是什么意思? – Saasha 2012-02-08 10:44:30

+0

很高兴你能重现。 Prolly只是意味着三星没有做好整合BT的工作。 – broody 2012-02-08 15:26:23

+0

我在2.3.3版本中看到Galaxy Tab GT-P1000(原版)的相同症状。我的应用做了一个bluetoothsocket连接,它连接到一个远程设备,但连接调用永远不会返回,最终我必须终止进程。在我的下一次运行中,我遇到了你观察到的问题。所以,问题的根源在于连接(对我而言)。 – Tom 2012-04-21 15:45:40

回答

2

如果任何人的兴趣..我发现这只发生在某些手机。经过约20-30个周期的停止和启动后,我可以持续在我的Samsung Galaxy S上重现此操作。相当频繁,我也将搭上“内存不足”的bluez来自这使我的问题所在的API之下......我不能重现此上的Droid X,HTC G2,或4G的myTouch。