Task란 작업을 의미하는 최소 단위이다.
Task 처리 모델에는 ① 동기식(Synchronous) 처리 모델과 ② 비동기식(Asynchronous) 처리 모델이 있다.
① 동기식(Synchronous) 처리 모델 : 순차적으로 작업을 처리
② 비동기식(Asynchronous) 처리 모델 : 병렬적으로 작업을 처리
AsyncTask는 비동기 처리를 할 수 있도록 스레드와 핸들러 기능을 하나의 클래스에 합쳐놓은 것이다.
1) AsyncTask<Params, Progress, Result>
AsyncTask 클래스를 정의할 때 3가지 제네릭을 지정한다. AsyncTask 구현 메서드의 인자 타입은 제네릭으로 결정된다.
제네릭 | 설명 |
---|---|
Params | doInBackground( ) 메서드가 전달받은 인자 타입 |
Progress | onProgressUpdater( )메서드가 전달받은 인자 타입 |
Result | onPostExecute( ) 메서드가 전달받은 인자 타입 |
2) doInBackground(vararg params: Params?): Result
doInBackground( ) 메서드는 작업을 시작하면 호출되고 백그라운드 스레드에서 동작한다.
3) onProgressUpdate(vararg values: Progress?)
doInBackground( ) 메서드 안에서 publishProgress( ) 메서드가 호출되면 실행된다. 메인 스레드에서 실행되므로 전달되는 파라미터 값으로 UI를 업데이트할 수 있다.
4) onPostExecute(vararg result: Result?)
doInBackground( )메서드가 Result 타입의 값을 반환하면 호출되는 메서드이며 메인 스레드에서 동작한다. 직업의 실행결과를 UI에 업데이트할 수 있다.
5) asyncTask.execute( )
스레드의 start( )와 같은 역할을 한다. AsyncTask를 실행하기 위해 반드시 호출되어야 한다.
① 한 번 실행한 AsyncTask는 다시 실행할 수 없고 새로운 AsyncTask를 생성해 실행해야 한다.
② AsyncTask를 사용해서 스케쥴링 할 수 있는 작업 수의 제한이 있고 몇 초 정도의 짧은 작업에서만 이상적으로 동작한다는 한계가 있다.
③ 안드로이드 버전 별로 병렬 처리 동작이 다르므로 허니콤 이후 버전에서 멀티 스레드 작업을 원한다면 AsyncTask를 실행할 때 AsyncTask.THREAD_POOL_EXECUTOR 스케줄러를 지정해야 한다.