私は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();
あなたは、コードのブロックを投稿することができますか? – user1506104
スレッドは 'while(!isInterrupted()) { int size = inputStream.read(buffer)です。 。 。 。プロセスバッファ } ' メインスレッドは inputStream.close(); – Droidum
'read'にはIOExceptionがあります。これをキャプチャしていますか?あなたのソースコードをより多く表示することにより、より多くの情報を提供してください。 – user1506104