- execute() 명렁어를 이용하여 AsynkTask를 실행합니다.
- AsyncTask로 Background 작업을 실행하기 전, onPreExcuted()가 실행됩니다.
- 새로 만든 Thread 에서 Background작업을 수행합니다. execute() Method를 호출할 때 사용된 Parameter를 전달 받습니다.
- doInBackground()에서 중간 준강 진행 상태를 UI에 업덱이트 하도록 하려면 publishProgress() Method를 호출합니다.
- onProgressUpdate() Method는 publishProgress()가 호출 될 때마다 자동으로 호출됩니다.
- doInBackground() Method에서 작업이 끝나면 onPostExcuted()로 결과 Parameter를 Return 하면서 Return 된 값을 통해 Thread Task가 끝났을 때의 동작을 구현합니다.
핵심은 onPreExecute(), onProgressUpdate(), onPostExecute() Method는 Main Thread에서 실행되므로 UI Object에 자유롭게 Access할 수 있어요.
- Params : doInBackground Parameter Type이며, execute Method인자 값이 됩니다.
- Progress : doInBackground Task때, 진행 단위의 Type입니다. onProgressUpdate Parameter Type 입니다.
- Result : doInBackground 리턴값 입니다. onPostExecute Parameter Type임.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 버튼을 클릭하면 파일 다운로드 경로를 파라미터로 AsyncTask 실행
public void OnClick(View view) {
switch (view.getId()) {
case R.id.button:
try {
new DownloadFilesTask().execute(new URL("파일 다운로드 경로1"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
}
}
private class DownloadFilesTask extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Long doInBackground(URL... urls) {
// 전달된 URL 사용 작업
return total;
}
@Override
protected void onProgressUpdate(Integer... progress) {
// 파일 다운로드 퍼센티지 표시 작업
}
@Override
protected void onPostExecute(Long result) {
// doInBackground 에서 받아온 total 값 사용 장소
}
}
}
- API16(젤리빈) 미만 버전에서는 AsyncTask 선언을 UI Thread에서 해주지 않으면 오류가 발생한다.
- excutes(Params)는 UI스레드에서 직접호출해야 함.
- 수동으로 onPreExecute(), onPostExecute(Result), doInBackground(Params...),
onProgressUpdate(Progress...) 호출하면 안됨.
- Task는 오직 한번만 실행될 수 있음
- 하나의 객체이므로 재사용이 불가능 합니다.
- 구현한 Activity 종료 시 별도의 지시가 없다면 종료되지 않습니다.
- Activity 종료 후 재시작 시 AsyncTask의 Reference는 invalid 되며, onPostExecute() Method는 새로운 Activity에 어떠한 영향도 끼치지 못합니다.
- AsyncTask의 기본 처리 작업 개수는 1개입니다.