반응형

AsyncTask는 백그라운드 작업을 하는데 Worker thread와 UI thread를 서로 분리하여 코드를 관리하지 않고 해당 클래스 내부에서 쉽게 다룰 수 있게 도와주는 추상 클래스이다.

 

이 AsyncTask를 사용하기 위해서는 onPreExecute(), doInBackground(), onProgressUpdate() , onPostExecute()를 이해하고  Override로 사용하면 된다.

 

1. onPreExecute() (UI thread)

 

이 코드를 통해 백그라운드에서 실행하기 전 사전 작업을 정의할 수 있다.

보통 progress value가 없는 상태에서 progress (뱅글뱅글 도는 로딩 화면)를 이용하고 싶다면 이 부분에서 보통 사용한다.

 

 

2. doInBackground() (Worker thread)

 

백그라운드에서 어떤 일을 수행할 지 코드를 넣어주는 부분이다.

이 부분은 worker thread가 동작하게 되고 UI thread에 영향을 끼치는 내용을 넣을 수 없다.

 

 

3. onProgressUpdate()

 

doInBackground에서 어느정도 진행이 됐는지 value를 publishProgress()라는 메소드를 통해 보내주면 onProgressUpdate에서 value를 받아 진행 상태를 표시할 수 있게 도와준다.

 

4. onPostExecute() (UI thread)

 

백그라운드 작업이 끝난 후 동작해야할 내용을 입력해준다.

보통 백그라운드에서 수행한 결과물을 패킹하거나 이벤트를 날려주는 역할을 한다.

 

 

 

아래 코드는 실제 어떻게 동작하는지 나타내주는 그림이다.

 

AsyncTask<param, param, param>을 보면 generic으로 구성되어 있음을 알 수 있는데

파라미터 순서대로 <doInBackground, onProgressUpdate, onPostExecute>의 파라미터로 들어가게 된다.

 

* 이때 다양한 param을 사전에 asyncTask에 주입하고 싶으면 생성 시 생성자를 통해 주입해주면 된다.

 

- execute를 통해 String을 보내고 있다.

이는 doInBackground의 파라미터로 들어가는 첫번째  generic parameter이다.

 

- doInBackground에서 process를 거친 뒤 publishProgress에  parameter를 던지면 이게 두번째 generic이 된다.

 

- 마지막으로 doInBackground의 리턴값이 세번째 generic이 되며 이 리턴값은 onPostExecute로 넘어가 백그라운드에서 받은 결과물을 이용할 수 있게 된다.

 

 

 

 

 

 

 

 

반응형