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


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

어떻게 하면 좋을까요?

  • 2016년 05월 20일에 작성됨

조회수 115


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"/>

  • 2016년 05월 21일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close