AsyncTask
AsyncTask는 비동기적으로 실행될 필요가 있는 작업을 위해 사용하는 클래스이다. AsyncTask를 상속받아 새로운 클래스를 만들면 그 안에 워커 스레드를 위한 동작 코드와 UI 접근 코드를 한 번에 넣을 수 있다. 예를 들면 웹서버에서 고객 아이디를 가져오는 통신 작업, 즉 백그라운드에서 해야 하는 작업과 가져온 정보를 UI에 업데이트 하는 작업을 동시에 하고 싶다면 AsyncTask 상속 클래스를 만든 후 해당 클래스에 로직을 구현해주면 된다.
AsyncTask 장점으로는 비동기적 처리를 하기 쉽고, Handler보다 코드적으로 깔끔하다는 점이 있다. AsyncTask는 핸들러와 달리 무조건 메인 스레드에서 생성하고 실행해야한다.
비동기적 처리의 다른 방식으로는 Thread-Handler, Coroutine이 존재한다.
※ Thread-Handler와 AsyncTask는 현재 공식 Deprecation 된 상태이므로 비동기적 처리를 구현할 때 Coroutine 사용을 권장한다.


Deprecated 된 이유
AsyncTask는 사용하기 편리하다는 장점이 있었지만, 사실 치명적인 문제점들이 많다.
우선 사용상으로의 단점으로는 오직 한 번만 실행되어 재사용이 불가능하다는 점, 종료를 직접 해주지 않으면 종료가 되지 않아 메모리 누수가 발생한다는 점, 항상 UI 스레드 상에서 호출해야 한다는 점 등이 있다.
- 메모리 릭
화면이 회전할 때 액티비티는 종료되었다가 새롭게 생성된다. 이 경우 AsyncTask가 계속 중첩되어 실행될 수가 있다. 새로 생성된 액티비티는 완전히 다른 인스턴스인데, AsyncTask가 실행되고 있던 와중에 화면 회전이 일어난 거라면 기존 액티비티조차 메모리에서 해제되지 않는다. 이는 OutOfMemory 에러를 뿜을 가능성이 농후하다. - 순차적으로 실행되기 때문에 속도가 저하될 수 있음
- Fragment 에서 AsyncTask를 실행할 경우
Fragment에서 AsyncTask를 실행하고 뒤로가기 키를 통해 액티비티를 종료하면, Fragment 가 Activity 와 분리되면서 getContext(), getActivity() 등이 null 을 반환하게 되어 onPostExecute() 에서 NullPointerException이 발생하게 된다. - 취소 메소드만 있고, onError()와 같은 예외처리 메소드 없음
- AsyncTask 병렬 실행 시 doInBackground()의 실행순서가 보장되지 않음
안드로이드 버전이 올라가면서, 기본 동작이 순차 실행으로 바뀌었기 때문에 플랫폼의 버전에 따라 일관되지 않은 동작을 야기할 수 있는 점이 문제이다.