android.os.NetworkOnMainThreadException при попытке использования getLocalHost() [дубликат]

321
09 июня 2017, 09:51

Данный вопрос уже был задан и имеет решение:

  • Вылетает приложение при попытке использовать Jsoup 1 ответ

Занимаюсь созданием клиент-сервера на сокетах при помощи java, с той особенностью, что в моем случае клиентом выступает приложение написанное на android.
И если с сервером все хорошо(проверял его работу через telnet), то с клиентом выходят большие проблемы.
При попытке получить локальный хост:
InetAddress ipAddress = InetAddress.getLocalHost();
Выдает следующую ошибку(если через try-catch попросить вывести в лог):

android.os.NetworkOnMainThreadException

Подключал работу с сетью в манифест-файл, но не помогло:
< uses-permission android:name="android.permission.INTERNET"/>
Перерыл форумы, но подобной проблемы не нашел, поэтому обращаюсь сюда:)

Answer 1

Ваш код ошибки сам за себя говорит - нельзя использовать в главном потоке работу с сетью.

Вы можете запустить в отдельном потоке используя Thread:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try  {
            //ваш код работы с сетью
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start(); 

Можете разрешить работу в основном потоке (категорически не рекомендуется):

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

Можете использовать AsyncTask:

class RetrieveFeedTask extends AsyncTask<Void, Void, Void> {
    private Exception exception;
    protected RSSFeed doInBackground(Void... void) {
        try {
            //ваш код работы с сетью
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }
    protected void onPostExecute(Void void) {
        // здесь можете обрабатывать ошибки при работе с сетью
    }
}
  1. Про AsyncTask по-русски: Класс AsyncTask
  2. О Thread по-русски: Потоки. Класс Thread и интерфейс Runnable
Answer 2

Из основного потока нельзя отправлять запросы. Только через AsyncTask, как сказано выше :)

READ ALSO
из MySQL в JTable

из MySQL в JTable

Имею много таблиц в БД с разных кол-вом полей, которые необходимо вывести в JTableИдея такова:

384
Аспект в контейнере Spring?

Аспект в контейнере Spring?

Нужно ли мне что б мой аспект работал обьявить его в контейнере Spring, или достаточно будет всего:

256
Как вывести данные из базы данных в listview

Как вывести данные из базы данных в listview

Имеется база данных и активити с компонентом listview как из готовой базы вывести в listview элементы из таблицы? Базу подключаю вот так

575
Java API для работы с битриксом

Java API для работы с битриксом

Существуют ли какие-нибудь API для работы с битриксом из Java?

367