Android 9.0 создает сокет в главном потоке вызывает android.os.NetworkOnMainThreadException - PullRequest
0 голосов
/ 06 июня 2019

В последнее время я часто сталкивался с этой ошибкой ... и это стало происходить только на 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

Хотя я бы / должен ожидать 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() не будет использовать сетевые ресурсы.

1 Ответ

1 голос
/ 06 июня 2019

Это исключение довольно старое и будет выдано при попытке выполнить какую-либо работу в сети в основном потоке и если ваш targetSDK является Honeycomb или новее (SDK 11).

Вы должны создать свой сокет асинхронно, так как создание сокета также может занять некоторое время.

См. https://developer.android.com/reference/android/os/NetworkOnMainThreadException

...