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 期望 UnknownHostExceptionSecurityException

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