본문 바로가기
Android/Exceptions

android.os.NetworkOnMainThreadException

by featherwing 2020. 3. 13.
반응형

안드로이드는 메인쓰레드에서 UI에 관한 처리를 하고 있습니다.

 

즉, 앱이 유저와 상호작용하는 모든 행동이 메인쓰레드를 통해서 이루어집니다.

 

버튼을 누르면 어떠한 정보를 네트워크로 동기화 하여 리사이클러뷰로 정리한 뒤 보여주는 앱이 있다고 가정해보면,

 

버튼을 누르고 > 네트워크로 정보를 다운로드 받고 > 리사이클러뷰에 다시 업데이트 

 

하는 상기의 과정을 모두 메인 쓰레드에서 수행하게 된다면 

 

버튼을 누르는 순간부터 작업이 완료될 때 까지마냥 기다려야 합니다.

 

그 시간동안 어떠한것도 할 수 없이 기다리게 된다면, 사용자에게는 최악의 경험이 된다고 할 수 있습니다. 

 

따라서, 안드로이드 OS의 최우선 목표는, 앱 내부에서 이루어지는 모든 작업이 유저를 방해하지 않도록 하는것이며

 

따라서 시간이 오래 걸리는 작업은 메인쓰레드에서 할 수 없도록 되어 있습니다.

 

 

NetworkOnMainThreadException은

 

네트워크 작업같이 시간이 오래 걸리는 작업을 메인쓰레드(UI쓰레드)에서 수행할 때 발생하는 것으로

 

대표적으로 예를들면 Jsoup를 이용한 파싱등의 작업을 메인쓰레드에서 수행하려고 했을 때 발생하게 됩니다.

 

해당 작업들은 메인쓰레드와 독립적으로 수행될 수 있도록 비동기로 수행될 수 있도록 만들어 주어야 합니다.

 

비동기의 구현은 여러가지 방법이 있으나, 대표적으로는 *AsyncTask, Coroutine, RxJava 등으로 구현할 수 있습니다.

 

* AsyncTask는 Android 11부터 Deprecated 됩니다.

 

비동기의 구현방법은 아래를 참고해 주세요

 

AsyncTask, Coroutine, RxJava를 이용한 비동기의 구현

 

  

반응형

댓글