제대로 공부도 안하고 doInBackground와 onPostExecute만 이용하거나 thread만 구현해서 사용해왔다. 그런데 AsyncTask를 많이 접하게 되면서 제대로된 사용을 위해 작성해본다.
- Thread와 Handler를 모르더라도 이 기법을 사용할 수 있게끔 짜여져 있는 abstract class이다.
- 내부적으로 백그라운드 쓰레드를 생성한다.
- 필요할 때마다 UI에서 실행될 콜백메서드 호출이 가능하다.
▶ abstract class 이므로 generic parameter로 3가지 형태를 전달해 준다.
1. Params : 실행할 때 전달할 인수의 형태
2. Progress : 매 작업 단계마다 진행상태를 표기하는 형태
3. Result : 작업 결과로 리턴될 형태
▶ callback method
1. void onPreExecute() :
- doInBackground(Params) 호출 전에 먼저불린다.
- doInBackground(Params) 작업전에 초기화 처리, dialog같은 작업을 처리한다.
2. Result doInBackground(Params ...params) :
- 백그라운드 쓰레드에서 실행되기 때문에 연산이 오래걸리는 부분을 여기서 담당한다.
- execute(Params)메서드로 인자를 전달하는데 이 인자는 여러개가 전달이 가능하다.
- 여러개의 전달된 인자는 배열처럼 이용한다.
- 작업중에 publishProgress(Progress)로 이용해서 작업경과를 UI thread에 보고할 수 있다.
- 결과를 onPostExecute(Result result)의 인자로 반환한다.
3. void onPostExecute(Result result) :
- 이는 doInBackground(Params)가 호출된 다음 불린다.
- doInBackground작업의 결과를 이용한 UI 업데이트에 이용하기 좋다.
4. void onProgressUpdate(Progress ...values) :
- doInBackground에서 publishProgress(Progress)를 이용해 호출한다.
- 인자값에 따른 작업의 상태를 UI에 표시한다던가 이런 류의 작업을 할때 이용된다.
5. void onCancelled() :
- cancel메서드로 작업을 취소했을 경우 불리는 메서드이다.
- 자원의 반환같은 처리등을 하면 좋다.
▶ AsyncTask class method callback
1. AsyncTask<Params,Progress,Result> execute(Params... params) :
- execute를 호출하면 AsyncTask의 각 메서드가 순차적으로 호출되어 작업을 수행한다.
- 반환되는 AsyncTask객체는 메인 스레드에서 참조가 가능하며 다음 메서드들을 호출한다.
- 인자값을 넘겨주는데 형태만 같다면 여러개를 동시에 넘길 수 있다.(배열형태로 넘기는게 아님)
2. boolean cancel(boolean mayInterruptIfRunning) :
- 작업을 취소한다. onCancelled()메서드 호출한다.
- 작업 취소가 실패되는 경우가 있는데 이미 작업이 완료되었거나 이미 취소된 경우, thread safe하지 않은 경우이다.
- 작업이 시작되기전에 호출할 경우 취소를 성공한것으로 처리된다.
3. boolean isCancelled() :
- isCancelled 메서드는 정상 종료되지 않고 취소되었는지를 반환한다.
4. Result get([long timeout,TimeUnit unit]) :
- 작업이 완료되기까지 대기하며 작업결과를 돌려 받는다.
- 필요시 인자값을 전달해서 대기할 타임아웃값을 지정할 수 있다.
5. AsyncTask.Status getStatus() :
- 작업의 현재 상태를 조사
- 아직 시작하지 않은 상태이면 PENNING이 반환된다.
- 실행중인 경우에는 RUNNING이 반환된다.
- 작업이 완료된 경우에는 FINISHED가 반환된다.
주의 할 점은 Backgorund단에서 실행되는 메서드인 doInBackground(), publicProgress()에서는 UI에 접근하는 작업을 하면 안된다.