Android 9.0 在主线程上创建套接字导致 android.os.NetworkOnMainThreadException
Android 9.0 creating a socket out on main thread cause android.os.NetworkOnMainThreadException
我最近经常遇到这个错误......而且它只在 Android 9.0 上才开始发生。
此方法只是为我将要使用的连接创建 DatagramSocket
(在单独的 AsyncTask
上)
private boolean initLink() {
Log.d(this.getClass().getName(), "initLink()");
try {
platformIPAddr = InetAddress.getByName(platformIPAddrStr);
socket = new DatagramSocket();
socket.setReuseAddress(true);
} catch (Throwable e) {
Log.e(this.getClass().getName(), e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
如果套接字的创建因某些错误而失败(即 platformIPAddrStr
上的损坏值),系统抛出的异常是:
android.os.NetworkOnMainThreadException
虽然我 would/should 期望 UnknownHostException
或 SecurityException
。
class SendCommandTask extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
try {
sendCommands();
}
catch (Throwable e)
{
Log.e(this.getClass().getName(), e.getMessage());
}
return null;
}
}
如果您想知道如果 InitLink()
失败 SendCommands()
将不会使用网络资源。
这个异常已经很老了,当你试图在主线程上执行任何网络并且你的 targetSDK 是 Honeycomb 或更新版本 (SDK 11) 时会被抛出。
您应该异步创建套接字,因为套接字创建也需要一些时间。
参见 https://developer.android.com/reference/android/os/NetworkOnMainThreadException
我最近经常遇到这个错误......而且它只在 Android 9.0 上才开始发生。
此方法只是为我将要使用的连接创建 DatagramSocket
(在单独的 AsyncTask
上)
private boolean initLink() {
Log.d(this.getClass().getName(), "initLink()");
try {
platformIPAddr = InetAddress.getByName(platformIPAddrStr);
socket = new DatagramSocket();
socket.setReuseAddress(true);
} catch (Throwable e) {
Log.e(this.getClass().getName(), e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
如果套接字的创建因某些错误而失败(即 platformIPAddrStr
上的损坏值),系统抛出的异常是:
android.os.NetworkOnMainThreadException
虽然我 would/should 期望 UnknownHostException
或 SecurityException
。
class SendCommandTask extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
try {
sendCommands();
}
catch (Throwable e)
{
Log.e(this.getClass().getName(), e.getMessage());
}
return null;
}
}
如果您想知道如果 InitLink()
失败 SendCommands()
将不会使用网络资源。
这个异常已经很老了,当你试图在主线程上执行任何网络并且你的 targetSDK 是 Honeycomb 或更新版本 (SDK 11) 时会被抛出。
您应该异步创建套接字,因为套接字创建也需要一些时间。
参见 https://developer.android.com/reference/android/os/NetworkOnMainThreadException