27

Как исправить 'android.os.NetworkOnMainThreadException'?

17

Я столкнулся с ошибкой при запуске моего 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

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

5 ответ(ов)

5

Я решил эту проблему, создав новый Thread. Вот как это можно сделать:

Thread thread = new Thread(new Runnable() {
    
    @Override
    public void run() {
        try {
            // Ваш код здесь
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start(); 

Запуск нового потока позволяет выполнять ваш код асинхронно, что полезно, если вы хотите избежать блокировки основного потока приложения. Не забудьте обрабатывать возможные исключения, чтобы избежать неожиданных сбоев.

1

Есть два решения этой проблемы.

  1. Не используйте сетевые вызовы в основном потоке UI. Вместо этого используйте асинхронные задачи для этого.
  2. Вставьте следующий код в файл MainActivity после строки setContentView(R.layout.activity_main);:
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

Также добавьте следующую строку импорта в ваш Java-файл:

import android.os.StrictMode;
0

Сетевые операции не могут быть выполнены в главном потоке. Вам необходимо выполнять все сетевые задачи в дочернем потоке или использовать AsyncTask.

Вот пример того, как запустить задачу в дочернем потоке:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // Ваша реализация здесь
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}).start();

Таким образом, вы избежите блокировки главного потока и обеспечите плавную работу вашего приложения.

0

Чтобы выполнить сетевые действия в отдельном потоке, вы можете использовать класс Thread, как показано в следующем примере:

new Thread(new Runnable() {
    @Override
    public void run() {
        // Выполните сетевое действие в этой функции
    }
}).start();

Не забудьте также добавить разрешение на использование интернета в файл AndroidManifest.xml, чтобы ваше приложение могло выполнять сетевые операции:

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

Таким образом, вы сможете избежать ошибок, связанных с выполнением сетевых запросов в основном (UI) потоке, и ваше приложение будет работать более стабильно.

0

Чтобы выполнить ваш код в отдельном потоке, вы можете использовать следующий подход:

Вариант с использованием Thread:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // Ваша реализация
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}).start();

Или вы можете воспользоваться классом AsyncTask, что является более удобным способом для выполнения фоновых операций в Android:

class DemoTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {
        // Ваша реализация
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO: выполнить действия с результатом
    }
}

Выбор между этими вариантами зависит от вашего конкретного случая использования. Thread предоставляет более низкоуровневый контроль, в то время как AsyncTask упрощает работу с фоновыми задачами и обработкой результатов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь