Millerish
@Millerish

Первый проект на java. Как решить NetworkOnMainThreadException?

Доброе время суток!

Изучаю java и android. Помогите разобраться с первым тестовым проектом.

Файлы: YandexTranslate.java и MainActivity.java

Вылетает ошибка NetworkOnMainThreadException. Как я понимаю она обычно бывает в том случае когда обращение к интернету в main. Я вынес ее в отделенный класс, почему у меня появляется эта ошибка? Как исправить?

Из консоли:

09-07 13:46:04.796 25701-25701/info.stekolschikov.ytranslate E/AndroidRuntime: FATAL EXCEPTION: main
Process: info.stekolschikov.ytranslate, PID: 25701
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:217)
at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
at info.stekolschikov.ytranslate.YandexTranslate.translate(YandexTranslate.java:58)
at info.stekolschikov.ytranslate.MainActivity$1.onClick(MainActivity.java:40)
at android.view.View.performClick(View.java:4851)
at android.view.View$PerformClick.run(View.java:20016)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5429)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
  • Вопрос задан
  • 801 просмотр
Решения вопроса 2
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Ваше "обращение к интернету" нужно вынести в отдельный поток, а не в отдельный класс.
Ответ написан
mitaichik
@mitaichik
Ява многопоточная, у приложения есть главный поток (отрисовывает UI например) и чтоб его всякие запросы в инет не блокировали, андройд запрещает делать их в главном потоке. Соответсвенно, вам нужно запустить интернет-запрос в отдельном потоке.

Мой совет - юзайте библиотеки которые делют запросы за вас: okhttp / retrofit
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Dornoom LP Москва
от 100 000 до 150 000 руб.
ММТ Москва
от 80 000 до 140 000 руб.
Экспресс Точка Ру Санкт-Петербург
от 120 000 руб.
21 февр. 2019, в 19:31
2000 руб./за проект
21 февр. 2019, в 18:22
20000 руб./за проект
21 февр. 2019, в 17:43
15000 руб./за проект