android.os.NetworkOnMainThreadException은 어떻게 해결하나요?
조회수 5078회
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 답변
-
위의 예외는 애플리케이션의 메인 쓰레드에서 네트워크 연산을 실행했을 때 발생합니다. 때문에 아래처럼 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"/>
댓글 입력