0

Bluetooth通信を使用するスレッドをAndroidに実装しようとしています。I / Oでブロックしているときでもスレッドを中断可能にしたいので、InterruptibleChannelが良い解決策のようです。私の質問は、コードはどのように見えるべきですか? 私がこれまでに持っているものは何も送信していないようです。ここにあります:

this.outstream = Channels.newChannel(outstream);
this.outstream.write(message); 

outstreamBluetooth ソケットから派生した OutputStream はどこにありますか。

4

1 に答える 1

2

コメントで言及したタイマースレッドがあり、一定の時間が経過するとチャネルが中断されると仮定すると、処理する必要のある2つのケースがあり、それぞれに独自のチェック済み例外があります。

  • ケース1:close()I / O操作でスレッドがブロックされているときに、チャネルで呼び出された別のスレッド。への呼び出しは。writeで中止されますAsynchronousCloseException
  • ケース2:interrupt()I / O操作でブロックしているときに、別のスレッドがスレッドで呼び出されました。への呼び出しは。write()で中止されClosedByInterruptExceptionます。

これらの例外を処理するようにコードを更新する必要があります。

this.outstream = Channels.newChannel(outstream);
try {
    outstream.write(message);
}
catch(AsynchronousCloseException e) {
    System.out.println("Another thread closed the stream while this one was blocking on I/O!");
}
catch(ClosedByInterruptException e) {
    System.out.println("This thread has been interrupted while blocking on I/O!");
}

のコントラクトでは、現在のスレッドがI/O操作でブロックされている場合InterruptibleChannelにのみこれらの例外がスローされるように指定されていることに注意してください。スレッドブロックされていない場合、これらの例外はいずれもスローされません。その場合、別のスレッドがチャネルを閉じた場合、閉じたチャネルに書き込もうとすると別のIOExceptionが発生する可能性があり、現在のスレッドの中断ステータスに注意を払っていない場合は、書き込みを続行します。ただし、その場合の動作はインターフェイスで指定されていないため、何をするかは実装者が決定します。

于 2012-04-11T11:51:07.383 に答える