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)
  • Вопрос задан
  • 783 просмотра
Решения вопроса 2
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Ваше "обращение к интернету" нужно вынести в отдельный поток, а не в отдельный класс.
Ответ написан
mitaichik
@mitaichik
Ява многопоточная, у приложения есть главный поток (отрисовывает UI например) и чтоб его всякие запросы в инет не блокировали, андройд запрещает делать их в главном потоке. Соответсвенно, вам нужно запустить интернет-запрос в отдельном потоке.

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

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

Войти через TM ID
Похожие вопросы
RentaTeam Москва
от 90 000 до 140 000 руб.
Frogogo Москва
от 70 000 до 100 000 руб.