android.os.NetworkOnMainThreadException

조회수 1572회
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 이런에러가 나옵니다. 어떻게 고쳐야할까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    android.os.NetworkOnMainThreadException이 에러는 애플리케이션이 메인쓰레드에서 네트워크 연산을 시도하면 발생하는데요. 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;
            }
        }
    
        protected void onPostExecute(RSSFeed feed) {
            // TODO: check this.exception 
            // TODO: do something with the feed
        }
    }
    

    이렇게해보세요. 실행은 new RetrieveFeedTask().execute(urlToRssFeed); 이렇게하면됩니다.

    그리고 안드로이드매니페스트에서 <uses-permission android:name="android.permission.INTERNET"/> 꼭해주세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)