출처 : http://neptjuno.tistory.com/33

public abstract class AsyncTask extends Object

세 가지 generic type(Params, Progress, Result)과 네 가지 step (onPreExecute, doInBackground, onProgressUpdate, onPostExecute)으로 구성

1. generic type
  1) Params : 실행 될 때 task에 전달된 파라미터의 type
  2) Progress : 백스라운드에서 작업하는 동안 발생되는 progress unit의 type
  3) Result : 백그라운드 작업에서 처리된 결과의 type
private class MyTask extends AsyncTask<void, void, void> {...}
private class MyTask extends AsyncTask<URL, Integer, Long>{...}
(필요없는 type에 대해서는 void로 작성)

2. step
  1) onPreExecute()
      - UI thread에서 호출된 즉시 호출되는 메소드
      - task를 setup하는 데 사용

  2) doInBackground(Params .. )
     - onPreExecute()의 수행이 끝난 후 백그라운드로 즉시 호출.
     - 긴 수행 시간을 요하는 작업을 백그라운드로 수행하는 역할
     - asynchronous task의 파라미터는 이 때 전달.
     - 수행 결과는 이 단계에서 반환되어야 하며 마지막 단계로 전달
     - publishProgress(Progress..)를 사용할 수 있으며 이 값들은 onProgressUpdate(Progress..)단계로 인해 UI thread에 불려지게 됨

  3) onPostExecute(Result)
      - 백그라운드 작업이 종료된 후에 UI thread에 호출되는 함수
      - 백그라운드에 계산된 결과가 이 단계의 파라미터로 전달됨

3. Threading rules
    - 이 task instance는 UI thread에서 생성되어져야만 한다.
    - execute(Param..)은 UI thread에서 호출되어져야만 한다.
    - onPreExecute(), onPostExecute(Result), doInBackground(Params..), onProgressUpdate(Progress..)는 수동으로 호출하지 않는다.
    - task는 오직 한번만 수행 될 수 있다.

출처 : http://tigerwoods.tistory.com/28


AsyncTask class
- backgrount 작업을 위한 모든 일(thread 생성, 작업 실행 UI와 통신 등)을 추상화 함으로 각각의 background 작업을 객체 단위로 구현/관리 할 수 있게 하는 것이 목적

type을 정할 필요가 없는 generic이 있다면 void전달

  • protected void onPreExecute():
     Background 작업이 시작되자마자 UI스레드에서 실행될 코드를 구현해야 함. (예. background 작업의 시작을 알리는 text표현, background 작업을 위한 ProgressBar popup등)
  • protected abstract Result doInBackground(Params… params):
    Background에서 수행할 작업을 구현해야 함. execute(…) 메소드에 입력된 인자들을 전달 받음.
  • void onProgressUpdate(Progress... values):
    publishProgress(…) 메소드 호출의 callback으로 UI스레드에서 보여지는 background 작업 진행 상황을 update하도록 구현함. (예. ProgressBar 증가 등)
  • void onPostExecute(Result result):
    doInBackground(…)가 리턴하는 값을 바탕으로 UI스레드에 background 작업 결과를 표현하도록 구현 함. (예. background작업을 계산한 복잡한 산술식에 대한 답을 UI 위젯에 표현함 등)
  • void onCancelled():
    AsyncTask:cancel(Boolean) 메소드를 사용해 AsyncTask인스턴스의 background작업을 정지 또는 실행금지 시켰을 때 실행되는 callback. background작업의 실행정지에 따른 리소스복구/정리 등이 구현될 수 있다.
background 작업의 시작과 background 작업 중 진행정보의 UI스레드 표현
1) final AsyncTask<…> execute(Params… params):
Background 작업을 시작한다. 꼭 UI스레드에서 호출하여야 함. 가변인자를 받아들임으로 임의의 개수의 인자를 전달할 수 있으며, 인자들은 doInBackground(…) 메소드로 전달된다.

2) final void publishProgress(Progress... values):
Background 작업 수행 중 작업의 진행도를 UI 스레드에 전달 함. doInBackground(…)메소드 내부에서만 호출.

AsyncTask인스턴스는 자기 자신을 pending, running, finished 이렇게 세 가지 상태(status)로 구분하는데 각각 AsyncTask:Status 클래스에 상수 PENDING, RUNNING, FINISHED로 표현 될 수 있다

public final AsyncTask.Status getStatus()
를 이용해 인스턴스 상태를 얻을 수 있음.
PENDING, RUNNING, FINISHED 중에서 리턴

'안드로이드' 카테고리의 다른 글

공유 가능 앱 리스트 가져오기  (0) 2017.03.06
안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AppWidget  (0) 2011.07.28
Broadcast Receiver  (0) 2011.07.26
나인패치  (0) 2011.07.26

+ Recent posts