일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 빅데이터
- 인공지능
- 컴퓨터공학
- 컴퓨터비전
- Yes
- 2
- 데이터베이스
- 머신러닝
- 소프트웨어공학
- 클라우드컴퓨팅
- 소프트웨어
- 네트워크
- 데이터과학
- 프로그래밍
- 웹개발
- 컴퓨터과학
- 자료구조
- I'm Sorry
- 딥러닝
- 사이버보안
- 자바스크립트
- 데이터분석
- 코딩
- 데이터구조
- 버전관리
- 파이썬
- 알고리즘
- 보안
- 네트워크보안
- 프로그래밍언어
- Today
- Total
스택큐힙리스트
'android.os.NetworkOnMainThreadException'을 어떻게 고칠 수 있나요? 본문
RssReader 안드로이드 프로젝트를 실행하는 중에 오류가 발생했습니다.
코드:
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
참고: API 레벨 30에서 AsyncTask가 사용 중지되었습니다.
AsyncTask | Android Developers
이 예외는 애플리케이션이 주 스레드에서 네트워킹 작업을 수행하려고 할 때 발생합니다. 코드를 AsyncTask에서 실행하세요.
class RetrieveFeedTask extends AsyncTask
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 파일에 추가하는 것을 잊지 마세요.
답변 2
'android.os.NetworkOnMainThreadException'란 무엇인가요?
'android.os.NetworkOnMainThreadException'는 안드로이드에서 발생하는 예외(예외 또는 오류)입니다. 이 예외는 앱이 메인 스레드(main thread)에서 네트워크 작업을 수행하려고 할 때 발생합니다.
안드로이드 앱은 UI를 처리하는 데 메인 스레드를 사용합니다. 이 스레드는 앱이 시작될 때 생성되며 모든 UI 작업을 처리합니다. 그러나 이 스레드가 네트워크 작업을 수행하면 앱이 응답하지 않는 것처럼 보일 수 있습니다.
이 문제를 해결하는 방법은 무엇인가요?
'android.os.NetworkOnMainThreadException'를 해결하는 가장 간단한 방법은 네트워크 작업을 별도의 스레드에서 수행하는 것입니다. 이렇게하면 메인 스레드가 차단되지 않고 앱이 계속 작동합니다.
스레드를 시작하는 방법은 다음과 같습니다.
```
new Thread(new Runnable() {
public void run() {
// 네트워크 작업을 수행하는 코드를 작성하세요.
}
}).start();
```
또는 안드로이드에서는 AsyncTask라는 클래스를 사용하여 스레드를 보다 쉽게 처리할 수 있습니다. 이 클래스는 작업을 백그라운드 스레드에서 처리하고 결과를 메인 스레드에 게시합니다.
```
private class NetworkTask extends AsyncTask
protected Void doInBackground(Void... params) {
// 네트워크 작업을 수행하는 코드를 작성하세요.
return null;
}
}
```
이 방법으로 할 수 있는 것이 많지만, 예를 들어 ImageView에 이미지를 로드하는 작업을 백그라운드 스레드에서 수행하는 방법은 다음과 같습니다.
```
private class NetworkTask extends AsyncTask
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (Exception e) {
return null;
}
}
protected void onPostExecute(Bitmap result) {
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(result);
}
}
```
'android.os.NetworkOnMainThreadException'는 안드로이드에서 일반적인 예외입니다. 네트워크 작업을 메인 스레드에서 수행하는 것을 피하는 것이 중요합니다. 위의 예제코드를 참고하여 새로운 스레드로 네트워크 작업을 보내기만 하면 됩니다. 해결되면 안드로이드 앱이 더욱 안정적이고 효율적일 것입니다.