android - android.os.NetworkOnMainThreadException 当套接字代码似乎在另一个线程上执行时
问题描述
错误
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
编码
final Thread receivingserveur = new Thread() {
public void run() {
int i=0;
while(i<3) {
try {
System.out.println( "start client" );
sock = new Socket( "90.57.69.108", 1234);
} catch (IOException e) {
e.printStackTrace();
}
try {
sock.setTcpNoDelay( true );
} catch (SocketException e) {
e.printStackTrace();
}
try {
dis = new DataInputStream( sock.getInputStream() );
} catch (IOException e) {
e.printStackTrace();
}
final String message_entrant21;
handler.post( new Runnable() {
@Override
public void run() {
Toast.makeText( getApplicationContext(), "start receiving data", Toast.LENGTH_SHORT ).show();
}
} );
try {
message_entrant21 = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
handler.post( new Runnable() {
@Override
public void run() {
Toast.makeText( getApplicationContext(), " received data", Toast.LENGTH_SHORT ).show();
}
} );
handler.post( new Runnable() {
@Override
public void run() {
TextView tv = (TextView) findViewById( R.id.textView4 );
tv.setMovementMethod( LinkMovementMethod.getInstance() );
tv.setText( Html.fromHtml( Message232 ) );
Toast.makeText( getApplicationContext(), Message232, Toast.LENGTH_LONG ).show();
}
} );
i += 1;
try {
sock.close();
} catch (IOException e) {
System.out.println( "error to send" );
e.printStackTrace();
}
}
}
};
int i=0;
receivingserveur.run();
我的提问
我想知道为什么当我在一个线程循环中发送一些数据时,对我来说,所有东西都不在主线程上,那么为什么他的错误提示android.os.NetworkOnMainThreadException
我什么时候在一个新线程上,可能是之前我执行服务器线程我执行另一个使用连接但这次发送数据的套接字的线程?我不认为是这种情况,因为另一个线程的名称与这个不同。
我认为最有可能的是我没有正确创建线程循环。
在所有这些问题中,我想知道为什么套接字无法连接并出现此错误?
如果您对这个问题不满意,请在产生影响之前告诉我。
解决方案
使用start()
而不是run()
实际启动一个新线程。
推荐阅读
- php - 使用 PHP SoapClient 调用 XML Soap 失败
- git - Sourcetree 和暂存更改的文件
- swift - 使用通用功能路由
- python - Turtle Graphics:如何向上移动标签?
- c# - WPF DataGrid - 从 DataGrid ItemsSource 对象的集合值中设置唯一的每行(对象)组合框值
- flutter - 在 Flutter 中,如何确保用于构建 GridView 的数据可用?
- r - Flexdashboard - 传单不是全屏
- python - 在 Python 中创建具有两个 y 轴和相同 x 轴/数据的图形
- php - Docker php56-fpm - 调用未定义的函数 apache_note()
- r - rbind 与部分列匹配?