/ ANDROID

AsyncTask

AsyncTask

Syntax: AsyncTask <Params, Progress, Result>

안드로이드에서 제공하는 추상클래스.

  • UI Thread를 쉽고 적절하게 사용할 수 있도록 해준다.
  • Background  작업을 수행하고 결과값을 별도의 Handler나 Thread 없이 UI Thread 반영할 수 있다.
  • AsyncTask는 Thread나 Handler의 Helper 클래스로 디자인 되었다.
  • AsyncTask는 짧은 시간을 소요하는 작업의 최적화 되어 있다.
  • 만약, 긴 시간을 필요로 하는 작업을 수행해야 한다면 java 1.5 부터 지원하는 java.util,concurrent 패키지의 Executor나 ThreadPoolExecutor, FutherTask 등을 사용하는 것이 좋다.
  • AsyncTask는 세 가지의 Generic Type이 필요하며, onPreExecute, doInBackground, onProgressUpdate, onPostExecute의 4가지 단계로 작업을 수행한다

(참고: 안드로이드에서 화면 갱신할 수 있는 스레드는 단 하나 뿐이고 이것을 Main thread 혹은 UI thread 라고 한다. UI thread가 복잡해질 경우 화면 갱신을 못하고 다른 작업을 수행하면서 ANR오류가 발생할 수 있다. 이 때, 화면 갱신 외의 시간이 걸리는 작업은 별도의 Worker thread를 생성하는 것이 좋다. 예를 들어 네트워크 통신.)

UI thread는 화면 갱신시 Handler를 통해 요청한다.

AsyncTask는 작업 중가중간의 화면 변경과 수행 후 해야할 동작에 대해 간단히 구현할 수 있다.

  1. AsyncTask 클래스는 반드시 UI Thread 내에서 로드되어야 한다. 즉, UI Thread가 아닌 다른 Thread 내에서 정의하면 안된다.
  2. AsyncTask의 인스턴스는 반드시 UI Thread 내에서 생성되어야 한다.
  3. AsyncTask를 실행하는 execute()는 반드시 UI Thread내에서 호출되어야 한다.
  4. onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute() 는 직접 호출하면 안된다.
  5. AsyncTask는 한 번만 호출해야 한다. 중복 호출일 경우 Exception이 발생한다.

http://blog.naver.com/wow2778/221016693320

 

execute

DownloadFilesTask = new DownloadFilesTask();

task.execute(url1, url2, url3);

execute를 통해 작업을 실행시키면 onPreExecute() -> doInBackground() -> onProgressUpdate() -> onPostExecute() 의 순서로 수행한다.

onPreExecute : 보통 작업 진행 정도를 프로그래스 바로 표현

doInBackGround : 실제로 백그라운드에서 수행하는 작업

onProgressUpdate : doInBackGround 작업 수행 도중에 publishProgress 실행 후에 UI Thread에 의해 호출된다. 작업의 진행정도 표시를 위한 프로그래스 바 업데이트에 사용됨

onPostExecute : doInBackGround 작업 수행 후 UI Thread에 의해 호출됨.