AnsyncTask는 UI Thread를 조금 더 쉽게 이용할 수 있도록 해주는 Class이다. 이 클래스를 사용하면 Thread나 Handler를 사용하지 않고도 UI Thread에서 백그라운드 작업을 수행하고 UI를 변경할 수 있다.
android.os.AsyncTask<params, progress, result>
<params, progress, result> 3개의 Generic type으로 정의한다.
params : Task를 실행시킬 때 넣어주는 parameter type
progress : 진행중에 사용되는 type
result : 결과로 return 되는 type
AsyncTask 를 상속받아 클래스를 생성해, 백그라운드에서 할 작업을 구현한다.
class MyTask extends AsyncTask<String, String, Void> {
}
doInBackground()
<params, , > 값은 doInBackground()의 parameter type이며, 배열로 전달된다.
< , , result > 값은 doInBackground()의 return type이다.
class MyTask extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... strings) {
return null;
}
}
onPreExecute()
doInBackground() 함수의 실행 전에 호출된다.
@Override
protected void onPreExecute() {
super.onPreExecute();
}
onPostExecute()
doInBackground() 함수가 끝나고 실행되는 함수이다.
result의 type은 doInBackground() 함수의 return type이며, 함수가 종료된 후 onPostExecute의 parameter로 전달된다.
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
UI Thread에서 Task 실행하는 방법
<params, . . > 에 따라 parameter값을 전달한다.
// Void 인 경우
myTask.execute();
// String 인 경우
myTask.execute("70.12.114.150");
execute().get()를 하는 경우
// execute().get()을 사용하면 Task가 종료되기 전까지 UI Thread가 대기상태가 된다
try {
int result = myTask.execute("70.12.114.150").get();
Log.d("click ", "..................." + result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}