2

私は Java で一般的なネットワーク ノンブロッキング ソケット ライブラリを使用しています。デフォルトの JVM ではすべて正常に動作しますが、Android プラットフォームでは次のコードがブロックされます。

DatagramChannel channel;
. . .
channel.bind(...)
channel.configureBlocking(false);
. . .
channel.register(udpSelector,  SelectionKey.OP_READ | SelectionKey.OP_WRITE);

register() のブロック、実行は 20 ~ 40 秒または永久にブロックできます。OP_READ のみまたは OP_WRITE のみと同じです。

修正方法のヒントはありますか?

編集:Android 2.3とAndroid 4.0.4で同じ問題

4

1 に答える 1

1

これは重複した質問です。Java の非ブロッキング IO セレクターによりチャネル レジスタがブロックされるを参照してください 。「セレクターにはいくつかの文書化されたレベルの内部同期があり、それらすべてに実行されています。register() を呼び出す前に、セレクターで wakeup() を呼び出してください。確認してください。選択されたキーがゼロの場合、選択ループは正しく機能します。これは wakeup() で発生します。"

于 2013-02-25T22:46:31.893 に答える