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

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

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

Войти через центр авторизации
Похожие вопросы