2016-09-28 13 views
1

私はAndroidのjavaのスレッドでFileInputStreamを使用してシリアルインターフェイスファイルから読み込みます。 stream.read(buffer)は、現在データが待機していない場合にブロックします。新しいデータが再び入ると、ブロックされます。データは毎度到着し、何かがスレッドに入っても実行され続けるたびに到着します。それは最高です!AndroidクローズFileInputStream

しかし、私はスレッドを終了したいとき、私は長い既知のバグに遭遇するようです。 thread.interrupt()はstream.read()をキャンセルしません。
それについて多くの質問があります。機能しなければならないのは、基本ストリームを閉じることだけです。しかし、FileInputStreamを閉じると、受信スレッドのstream.read()はまだ待機しています。データの次の束を受け取った後にのみ停止します - もちろんそれは間違った方向に行きます。

FileInputStreamを本当に閉じるかシャットダウンするには、ほかに何ができますか?

編集
私の解決策を議論した後、このように見えます。これは最高のパフォーマンスではなく、ドキュメントではアドバイスされていないが動作するavailable()を使用しています。

ファイルにリッスンスレッド:

byte[] buffer = new byte[1024]; 
while (!isInterrupted()) 
{ 
    if (stream.available() == 0) 
    { 
    Thread.sleep(200); 
    continue; 
    } 

    // now read only executes if there is something to read, it will not block indefinitely. 
    // let's hope available() always returns > 0 if there is something to read. 
    int size = stream.read(buffer); 

    now do whatever you want with buffer, then repeat the while loop 
} 

睡眠時間はすべての時間をループし、適切な間隔でデータを取得していないとのトレードオフです。 Mainthreadは、私はあなたがそのブロックread操作でできることは何もないと思い

stream.close(); // which has no effect to the thread but is clean 
thread.interrupt(); 
+0

あなたは、コードのブロックを投稿することができますか? – user1506104

+0

スレッドは 'while(!isInterrupted()) { int size = inputStream.read(buffer)です。 。 。 。プロセスバッファ } ' メインスレッドは inputStream.close(); – Droidum

+0

'read'にはIOExceptionがあります。これをキャプチャしていますか?あなたのソースコードをより多く表示することにより、より多くの情報を提供してください。 – user1506104

答えて

1

でこれを終了します。読み取る前に利用可能なデータがあるかどうかを確認するにはavailableを試してください。ここで

while(!isInterrupted()) { 
    int len = 0; 
    if(len = inputStream.available() > 0) 
    // read your data 
} 

は別のオプションです:How to stop a thread waiting in a blocking read operation in Java?

+1

私の恐怖を確認してくれてありがとう、少なくとも私は検索を止めることができます:-) スリープ状態のループでavailable()をチェックします。 available()は信頼できないと文書化されており、ビジー待機もうまくいきません。しかし、明らかに他の方法はありません。 – Droidum

+0

一番良い解決策を見つけたら、ここに投稿してください。私は解決策を知りたいと思っています。 ty。 – user1506104

+0

もそうでした – Droidum

関連する問題