我在运行RssReader的Android项目时出错。

代码:

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

如何解决此问题?


当前回答

只是为了明确地说明一些事情:

主线程基本上是UI线程。

因此,如果说您不能在主线程中执行网络操作,则意味着您不能在UI线程中进行网络操作,这意味着您也不能在其他线程中的*runOnUiThread(new Runnable(){…}*块中执行网络操作。

(我只是花了很长时间才弄明白为什么我在主线程之外的其他地方出现了这个错误。这就是为什么;这个线程有帮助;希望这个评论能帮助其他人。)

其他回答

在主线程上执行网络操作时,将引发android.os.NetworkOnMainThreadException。您最好在AsyncTask中执行此操作以删除此异常。这样写:

    new AsyncTask<Void,String,String>(){

        @Override
        protected Void doInBackground(Void... params) {
            // Perform your network operation.
            // Get JSON or XML string from the server.
            // Store in a local variable (say response) and return.
            return response;
        }

        protected void onPostExecute(String results){
            // Response returned by doInBackGround() will be received
            // by onPostExecute(String results).
            // Now manipulate your jason/xml String(results).
        }

    }.execute();
}

只是为了明确地说明一些事情:

主线程基本上是UI线程。

因此,如果说您不能在主线程中执行网络操作,则意味着您不能在UI线程中进行网络操作,这意味着您也不能在其他线程中的*runOnUiThread(new Runnable(){…}*块中执行网络操作。

(我只是花了很长时间才弄明白为什么我在主线程之外的其他地方出现了这个错误。这就是为什么;这个线程有帮助;希望这个评论能帮助其他人。)

从主(UI)线程访问网络资源会导致此异常。使用单独的线程或AsyncTask访问网络资源以避免此问题。

这仅适用于针对蜂巢SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以在其主事件循环线程上进行网络连接。

错误是SDK警告!

Android不允许单独的进程进入主活动线程,HTTP连接在这里是一个独立的线程。这就是你得到“android.os.NetworkOnMainThreadException”的原因。

在向用户显示网页视图之前,您可能需要检查实际的Internet连接,因为如果没有Internet,网页视图将向用户显示页面未找到错误,通常您不知道要显示什么。

为了检查Internet可用性,可以使用ping命令,但在Wi-Fi情况下,可以在Wi-Fi服务器上禁用ping,因此在这种情况下,您使用HTTP连接来检查请求的状态。

如果在向用户显示Web视图之前检查自己的Web视图URL链接,这可能是正确的方法。在这种情况下,你可以使用Android的严格模式,但不要允许所有的策略,因为你不需要它。

您应该只为严格模式提供网络允许策略。只需将以下行添加到代码中,就不会出现此错误。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);