android.os.NetworkOnMainThreadException은 어떻게 해결하나요?

조회수 4997회

ANDROID.OS.NETWORKONMAINTHREADEXCEPTION이 발생할땐 어떻게 해야하나요?

In the below code I got an error when running my Android project for RssReader.

밑에 코드처럼 안드로이드로 Rss를 읽어오는 프로젝트를 만들고있는데 위와같은 에러가 발생합니다.

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();

어떻게 하면 좋을까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    위의 예외는 애플리케이션의 메인 쓰레드에서 네트워크 연산을 실행했을 때 발생합니다. 때문에 아래처럼 AsyncTask를 사용해주면 쉽게 해결 할 수 있습니다.

    class RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {
    
        private Exception exception;
    
        //AsyncTask를 사용했을때 백그라운드로 실행할 내용
        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;
            }
        }
        //doInBackground작업이 끝나고 호출된다
        protected void onPostExecute(RSSFeed feed) {
            // TODO:  this.exception이 발생했는지 체크한다
            // TODO:  받아온 feed를 가지고 적절하게 처리
        }
    }
    

    MainActivity의 onCreate ()에서 new RetrieveFeedTask ().execute (urlToRssFeed);를 해주면 AsyncTask가 간단하게 호출됩니다.

    또 안드로이드매니페스트 파일에 밑에 코드처럼 퍼미션을 추가해주셔야 정상적으로 동작합니다. <uses-permission android:name="android.permission.INTERNET"/>

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

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

(ಠ_ಠ)
(ಠ‿ಠ)