안드로이드는 메인쓰레드에서 UI에 관한 처리를 하고 있습니다.
즉, 앱이 유저와 상호작용하는 모든 행동이 메인쓰레드를 통해서 이루어집니다.
버튼을 누르면 어떠한 정보를 네트워크로 동기화 하여 리사이클러뷰로 정리한 뒤 보여주는 앱이 있다고 가정해보면,
버튼을 누르고 > 네트워크로 정보를 다운로드 받고 > 리사이클러뷰에 다시 업데이트
하는 상기의 과정을 모두 메인 쓰레드에서 수행하게 된다면
버튼을 누르는 순간부터 작업이 완료될 때 까지마냥 기다려야 합니다.
그 시간동안 어떠한것도 할 수 없이 기다리게 된다면, 사용자에게는 최악의 경험이 된다고 할 수 있습니다.
따라서, 안드로이드 OS의 최우선 목표는, 앱 내부에서 이루어지는 모든 작업이 유저를 방해하지 않도록 하는것이며
따라서 시간이 오래 걸리는 작업은 메인쓰레드에서 할 수 없도록 되어 있습니다.
NetworkOnMainThreadException은
네트워크 작업같이 시간이 오래 걸리는 작업을 메인쓰레드(UI쓰레드)에서 수행할 때 발생하는 것으로
대표적으로 예를들면 Jsoup를 이용한 파싱등의 작업을 메인쓰레드에서 수행하려고 했을 때 발생하게 됩니다.
해당 작업들은 메인쓰레드와 독립적으로 수행될 수 있도록 비동기로 수행될 수 있도록 만들어 주어야 합니다.
비동기의 구현은 여러가지 방법이 있으나, 대표적으로는 *AsyncTask, Coroutine, RxJava 등으로 구현할 수 있습니다.
* AsyncTask는 Android 11부터 Deprecated 됩니다.
비동기의 구현방법은 아래를 참고해 주세요
AsyncTask, Coroutine, RxJava를 이용한 비동기의 구현
'Android > Exceptions' 카테고리의 다른 글
java.lang.ClassCastException (0) | 2020.04.04 |
---|---|
invalid drawable tag vector (0) | 2020.03.20 |
Manifest merger failed : Attribute application@appComponentFactory (2) | 2019.06.28 |
APK 빌드시 Lint found fatal errors while assembling - (1) | 2019.06.19 |
ad.loadClass에서 발생하는 ClassNotFoundException (0) | 2019.04.03 |
댓글