스택큐힙리스트

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

반응형
Comments