스택큐힙리스트

'android.os.NetworkOnMainThreadException'을 어떻게 고칠 수 있나요? 본문

카테고리 없음

'android.os.NetworkOnMainThreadException'을 어떻게 고칠 수 있나요?

스택큐힙리스트 2023. 3. 18. 14:12
반응형

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'는 안드로이드에서 일반적인 예외입니다. 네트워크 작업을 메인 스레드에서 수행하는 것을 피하는 것이 중요합니다. 위의 예제코드를 참고하여 새로운 스레드로 네트워크 작업을 보내기만 하면 됩니다. 해결되면 안드로이드 앱이 더욱 안정적이고 효율적일 것입니다.

반응형