为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复android.os.NetworkOnMainThreadException?

如何修复android.os.NetworkOnMainThreadException?

达令说 2019-05-20 15:43:40
我在为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我该如何解决这个问题?
查看完整描述

9 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

当应用程序尝试在其主线程上执行网络操作时,将引发此异常。运行您的代码AsyncTask

class RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            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();
        } catch (Exception e) {
            this.exception = e;

            return null;
        } finally {
            is.close();
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception
        // TODO: do something with the feed
    }}

如何执行任务:

MainActivity.java文件中,您可以在oncreate()方法中添加此行

new RetrieveFeedTask().execute(urlToRssFeed);

不要忘记将其添加到AndroidManifest.xml文件中:

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


查看完整回答
反对 回复 2019-05-20
?
慕森卡

TA贡献1806条经验 获得超8个赞

我用新的方法解决了这个问题Thread

Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try  {
            //Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }});thread.start();


查看完整回答
反对 回复 2019-05-20
?
largeQ

TA贡献2039条经验 获得超7个赞

你可以不执行网络I / O在UI线程上的蜂窝。从技术上讲,这可能在早期版本的Android,但它是一个非常糟糕的主意,因为它会导致你的应用程序停止响应,并可能导致操作系统杀死你的应用程序被用于非常表现。您需要运行后台进程或使用AsyncTask在后台线程上执行网络事务。

Android开发者网站上有一篇关于无痛线程的文章,这是对此的一个很好的介绍,它将为您提供比这里现实提供的更好的答案深度。


查看完整回答
反对 回复 2019-05-20
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

  1. 不要使用strictMode(仅在调试模式下)

  2. 不要更改SDK版本

  3. 不要使用单独的线程

使用Service或AsyncTask

另请参阅Stack Overflow问题:

android.os.NetworkOnMainThreadException从Android发送电子邮件


查看完整回答
反对 回复 2019-05-20
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

基于网络的操作无法在主线程上运行。您需要在子线程上运行所有基于网络的任务或实现AsyncTask。

这是您在子线程中运行任务的方式:

new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            // Your implementation goes here
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }}).start();


查看完整回答
反对 回复 2019-05-20
  • 9 回答
  • 0 关注
  • 4782 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信