2012-01-15 12 views
2

BluetoothServerSocketのaccept()コールで受信スレッドを受信しました。このスレッドは、別のスレッドによってかなり頻繁に強制終了され、再起動されます。 killシグナルを受け取ると、BluetoothServerSocketが閉じられ、accept()でIOExceptionが発生し、無限ループから抜け出します。しかし、これらの起動と再起動中に、listenUsingRfcommWithServiceRecord()コールが「不良ファイル番号」IOExceptionをキャッチし、ループを途中で終了することがあります。私はkillコンポーネント(?)でBTコンポーネントを正しくシャットダウンしていないかもしれないと思うが、まだ何かを理解していない...誰かに私にいくつかのポインタを教えてもらえますか?Android Bluetooth 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

Samsung Galaxy Sと同じ問題です。他のデバイスでは再生できません。どういう意味ですか? – Saasha

+0

うれしいことに再現できます。 Prollyは、サムスンがbtを統合して非常に良い仕事をしなかったことを意味します。 – broody

+0

私は2.3.3のGalaxy Tab GT-P1000(オリジナル)で同じ現象を見ました。私のアプリケーションは、リモートデバイスへの接続を行うbluetoothsocket接続を行いますが、接続コールは返されず、最終的にはプロセスを終了する必要があります。私の次の走りで、あなたが観察した問題が発生します。だから、問題の根は接続(私にとって)です。 – Tom

答えて

2

誰かが興味があるのなら、これは特定の電話機でのみ発生することがわかりました。私は一貫して私のサムスン銀河Sの約20-30サイクルの停止と開始後にこれを再現することができます。非常に頻繁に、私は問題の原因となるbluezからapiの下にある「メモリ不足」をキャッチします...私はこれをDroid X、HTC G2、またはmyTouch 4Gで再現することはできません。

関連する問題