1

device.createRfcommSocketToServiceRecord(MY_UUID)で作成されたBluetoothソケットでは、何も届かないときに一定の時間が経過した後、コードを実行しても、到着するとすぐにそのバイトを処理できるようにしたい。AndroidのBluetoothソケットにタイムアウトを設定する

.setSoTimeoutdescriptionは私に喜んで正確に何を説明します。

ゼロ以外のタイムアウト、読み取り(に設定このオプションを指定すると)このソケットに関連付けられたInputStreamの呼び出しが唯一のためにブロックしますこの時間量。タイムアウトが経過すると、Socketはまだ有効ですが、java.net.SocketTimeoutExceptionが発生します。

だから、私のコードをcatchのステートメントに入れるのに最適な機会のようです。

しかし残念ながら.setSoTimeoutは私のAndroidのメーカーによるBluetoothのソケットでは動作しません。どのように私はそのような方法なしにそのような機能を実装できますか?私はスレッドをロックすることはできませんので

Thread.sleepは、また明らかにオプションではありません。

+0

ハンドラを使用してこれを行うかどうかは、thread.sleepを置き換えることを意味します。 –

答えて

1

私は睡眠のための小さな間隔を使用したので、.setSoTimeout操作を模倣しようとすることで、とにかくのThread.sleepでそれを解決:

  • 短い睡眠を、タイムアウトに達するまで、着信データ、サイクルをチェックしますタイムアウトコードを実行します。

もっと良い解決策があると思いますが、これは今のところうまくいきます。

何バイトが入力ストリームに到着しない場合に与えられたコードは、(INTタイムアウトによって設定される)毎秒「タイムアウトコード」を実行します。バイトが到着すると、タイマーをリセットします。

// this belongs to my "ConnectedThread" as in the Android Bluetooth-Chat example 
public void run() { 
    byte[] buffer = new byte[1024]; 
    int bytes = 0; 
    int timeOut = 1000; 
    int currTime = 0; 
    int interval = 50; 
    boolean letsSleep = false; 
    // Keep listening to the InputStream 
    while (true) { 
     try { 
      if (mmInStream.available() > 0) {    // something just arrived? 
       buffer[bytes] = (byte) mmInStream.read(); 
       currTime = 0;        // resets the timeout 

       // ..... 
       // do something with the data 
       // ... 

      } else if (currTime < timeOut) {    // do we have to wait some more? 
       try { 
        Thread.sleep(interval); 
        } catch (InterruptedException e) { 
         // ... 
         // exception handling code 
        } 
       currTime += interval; 
       } else {         // timeout detected 
       // .... 
       // timeout code 
       // ... 
       currTime = 0;        // resets the timeout 
      } 
     } catch (IOException e) { 
      // ... 
      // exception handling code 
     } 
    } 
} 
+0

タイマーが良くなると言う人もいますが、これはうまくいきます:) – Peter

関連する問題