티스토리 뷰
앱은 Main Thread와 Work Thread의 협력으로 원활하게 동작할 수 있지만, 복잡성과 스레드마다 역할을 엄격히 구분해야 하는 문제점이 있다.
안드로이드에선 개발시간 단축 및 복잡성을 줄이기 위해 다양한 Thread Helper 가 존재하는데 이번 포스팅에서는 AsyncTask 클래스에 대해서 소개한다.
하지만 AsyncTask에는 여러 문제점이 존재했고 2019년 11월 8일 6시에 공식적으로 Deprecated 되었다.
AsyncTask는 전체적인 프로세스를 단순화하지만 안드로이드의 생명주기를 전혀 신경쓰지 않는다. 그렇게 때문에 액티비티나 프레그먼트가 재생성되거나 파괴었을 때 마무리 작업에 대한 내용이 보호되지 않는다.
예를 들면, 네트워크 요청과 같은 오래걸리는 작업을 Background에서 실행했고, 네트워크 요청이 완료될 대 UI를 업데이트 할 수 있습니다. 하지만 네트워크 요청이 완료될 때 UI와 관련된 부분이 더 이상 존재하지 않아 충돌 및 버그가 발생할 수 있다는 문제가 있다.
RxJava 및 Coroutine와 같은 라이브러리를 사용하면 된다.
AsyncTask는 Thread Class에 대한 Helper Class로 매우 사용빈도가 높다. (아니다!!!)
이유는 생명주기에 의해 모든 과정이 한눈에 보이고, 내부적으로 Sub Thread가 생성되며 Sub Thread가 해야할 작업과 Main Thread가 해야할 작업을 Method별로 구분해서 놓을 수 있어서 매우매우 직관적이기 때문이다.
AsyncTask 클래스를 상속(extends)해서 사용하면 되는데 아래와 같은 형태이다.
public class Countdown extends AsyncTask<String, Integer, Boolean> ....
여기서 제네릭에의해서 정해지는 3가지 자료형은 아래 사진과 같이 적용된다.
AsyncTask 클래스를 상속받게 되면 아래와 같은 5가지 Method를 반드시 Overring해야한다.
onPreExecute();
// 최초 UI를 전달해주는 역할
doInBackground();
// 백그라운드에서 동작하게 된다. 중간에 UI에 접근해야 할 경우 publishProgress 함수를 호출할 수 있다.
// publishProgress 함수를 호출하면 onProgressUpdate 함수를 내부적으로 호출한다.
onProgressUpdate();
// MainThread에서 동작하며 UI에 접근할 수 있다.
onCancled();
// Work Thread가 중간에 중단되게 되면 이 함수가 호출된다.
onPostExecute();
// 정상적으로 종료되면 이 함수가 호출된다.
이중에서 doInBackground() Method가 Sub Thread에서 실행되고 나머지는 Main Thread에서 실행된다.
AsyncTask의 생명주기.
여기서 doInBackground가 비정상적인 종료를 하게될경우
onPostExecute() 대신 onCancled() Method가 호출된다.
클래스 생성후 객체 생성 및 실행은.
객체.execute(인자들...);
→ 인자들은 doInBackground Method로 전달된다. (자료형 매칭 필수)
객체.getstatus()
→ 위 Method로 해당 객체(Thread)의 상태확인이 가능하다.
객체.cancle(true)
→ 위 Method를 통해 외부에서 해당 Thread를 강제로 죽일 수 있다.
'Android > Concept' 카테고리의 다른 글
[Android] startService (Local Service) (0) | 2019.08.20 |
---|---|
[Android] Service (0) | 2019.08.19 |
[Android] Thread와 Handler ( Feat. Sub Thread에서의 UI 설정 ) (0) | 2019.08.19 |
[Android] Thread 제약사항 (0) | 2019.08.19 |
[Android] 권한 부여하기 (0) | 2019.08.04 |