2

非ブロッキング モードで Java nio ソケットを使用していますが、write を呼び出すと、NetworkOnMainThreadException が発生します。

java.nio.channels.SocketChannel fd = Network.createTcpSocket();
java.nio.channels.SocketChannel.open();
java.net.Socket socket = fd.socket();
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
fd.configureBlocking(false);

//.. conect the socket

int ret = fd.write(data);
if(ret == 0)
{
  // It will block.
}

ソケットはブロックせず、呼び出しをブロックする必要がある場合に 0 を返すだけなので、これが機能することを期待します。しかし、私はまだ NetworkOnMainThreadException を受け取ります

12-07 18:50:25.704: W/dalvikvm(14931): threadid=1: thread exiting with uncaught exception (group=0x40c501f8)
12-07 18:50:25.834: E/AndroidRuntime(14931): FATAL EXCEPTION: main
12-07 18:50:25.834: E/AndroidRuntime(14931): android.os.NetworkOnMainThreadException
12-07 18:50:25.834: E/AndroidRuntime(14931):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
12-07 18:50:25.834: E/AndroidRuntime(14931):    at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:168)
12-07 18:50:25.834: E/AndroidRuntime(14931):    at libcore.io.IoBridge.sendto(IoBridge.java:477)
12-07 18:50:25.834: E/AndroidRuntime(14931):    at java.nio.SocketChannelImpl.writeImpl(SocketChannelImpl.java:369)
12-07 18:50:25.834: E/AndroidRuntime(14931):    at java.nio.SocketChannelImpl.write(SocketChannelImpl.java:327
4

3 に答える 3

1

これは正常な動作です。Socket クラスの内部にチェックがあると思いますが、それがブロッキングであろうとノンブロッキングであろうと関係ありません。スレッドが UI の場合 - NetworkOnMainThreadException をスローします

于 2012-12-14T13:41:02.373 に答える
1

android.os.NetworkOnMainThreadException :

アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。

AsyncTaskを使用して、Ui スレッドからネットワーク関連のタスクを作成します

または、API LEVEL 9を使用している場合は、ネットワーク リクエストを行う前に、メソッドの Current Activity にStrictModeを設定するだけです。onCreate()

   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
   .detectNetwork() // or .detectAll() for all detectable problems
   .penaltyDialog()  //show a dialog
   //.permitNetwork() //permit Network access 
   .build());
于 2012-12-14T13:42:06.817 に答える