Как я могу исправить android.os.NetworkOnMainThreadException? - PullRequest
2239 голосов
/ 14 июня 2011

Я получил ошибку при запуске моего проекта Android для RssReader.

Код:

URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();

И это показывает ошибку ниже:

android.os.NetworkOnMainThreadException

Как я могу исправить эту проблему?

Ответы [ 53 ]

0 голосов
/ 18 января 2018

С 2018 года я бы рекомендовал использовать RxJava в Kotlin для выборки по сети.Простой пример ниже.

Single.fromCallable {
        // Your Network Fetching Code
        Network.fetchHttp(url) 
    }
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe {
        // What you need to do with your result on the view 
        result -> view.updateScreen(result) 
    }
0 голосов
/ 26 февраля 2015

Вы должны просто добавить следующую строку в manifest.xml после тега манифеста

<uses-permission android:name="android.permission.INTERNET"/>

и в файле действий добавить следующий код после оператора связывания

if (android.os.Build.VERSION.SDK_INT > 9) {
   StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
   StrictMode.setThreadPolicy(policy);
}
0 голосов
/ 01 августа 2017

Никогда не выполняйте длительную работу в потоке пользовательского интерфейса, эта длительная работа может быть связана с сервером, читать / записывать в файл и т. Д. Эти задачи должны выполняться в фоновом потоке, поэтому Service, AsyncTask, Threads создано.Вы можете отключить StrictMode, что предотвратит сбой, но это никогда не рекомендуется.

Я бы посоветовал вам воспользоваться преимуществом StrictMode как минимум в режиме отладки.Используйте приведенный ниже код для получения журналов о любой проблеме, которая замедляет работу вашего приложения в главном потоке.

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());

Вы можете установить различные штрафы -

penaltyLog() // to print log
penaltyDeath() // This will crash you App(so costly penalty)
penaltyDialog() // Show alert when something went lazy on Main thread

Существует так много о https://developer.android.com/reference/android/os/StrictMode.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...