티스토리 뷰

AsyncTask 사용하기 입니다.


AsyncTask는 Thread와 똑같이 쓸 수가 있는건데 이건 안드로이드내에 기본적으로 들어있는 제너릭입니다. 


느낌은 Thread와 Handler가 합쳐졌다고 생각하시면 됩니다.


자료를 보시면 Thread랑 비슷한 구조인데 AsyncTask내에서 모두 처리가 가능합니다. 


AsycTask 내부적으로 열어보면 4가지 특징적인 메소드들이 있는데 큰 분류로는 2가지로 있습니다.


background 메소드 : 데이터처리용(Thread역할)

-doInBackground(A)

Foreground 메소드 : UI변경용 (Handler역할)

-onPreExecute() : 시작전에 UI변경

-onProgressUpdate(B) : 중간중간에 UI변경

-onPostExectute(C) : 다 끝나고 나면 UI변경


위의 4가지 메소드로 사용할 수 있고, 간편해서 더 안드로이드 스튜디오와 함께 시작한 사람들은 Thread-Handler보다 AsyncTask가 더 편하다는 차이가 있습니다. 그냥 자바 개발자들은 스레드가 익숙해서 편하다고 하니, 그냥 맞는거 골라서 쓰면 될것 같습니다.


위에 보시면 파라미터(매개변수)를 A, B C로 써놨는데,

AsyncTask를 선언할떄 제너릭변수로 AsyncTask<T, T, T> 의 형식으로 들어가는데 순서대로 A, B, C 라고 했습니다. 변수를 안쓰면 Void 라고 입력하면 됩니다.



먼저 가장 처음에 실행시킬떄 변수를 담아서 실행하면 onPreExecute() 메소드가 호출되어서 가장 처음에 프로그레스 바를 보여주거나 작업중이거나 불러오는중이라는 안내문구를 보여주는 창을 띄울 수 있고, 동시에 doInBackground가 A를 받아서 실행이 됩니다. doInBacground() 메소드 안에서는 publishProgress(B) 라는 메소드로 onProgressUpdate() 메소드를 실행을 할 수 있고, 시간차를 두고 실행시키도록 로직을 짜면, 주기적으로 UI를 업데이트하여, 진행상황을 확인할 수 있는 화면을 구현할수 있습니다.  모든 진행이 완료되면 자동적으로 doInBackground() 에서의 리턴값인 C로 onPostExecute()를 실행하여 최종적인 화면을 만들게 됩니다. 이 부분에선 진행중을 의미하는 Dialogue들을 모두 종료시켜주면 되겠죠?


AsyncTask는 시간차에 따른 UI 변경이 가능하게 하고 Thread는 일일이 다 구현해야하는 코드들을 한번에 해결할 수 있어서 좀 더 편리한 메소드라고 생각합니다. 대신에 커스터마이징하여 쓰기에는 정형화되어있기 때문에 바꿔서 사용하기에는 좀 불편한 부분이 있을 수도 있습니다. 뭐 그건 상황에 따라서 적절히 조화하여 쓰면 될것이라고 생각합니다. 



<AsyncTask 사용하기>


AsyncTask에는 Thread와 Handler 모두의 기능을 합쳐놓은 것 같다. 


AsyncTask와 Thread&Handler를 자유롭게 변환이 가능해진다면 쓰레드의 원리를 모두 이해했다고 볼 수 있다.

/**
* 쓰레드보다 더 작업이 편한 AsyncTask이다. 하나의 Task안에 UI변경과 데이터처리를 할 수 있다.
*/
class MyAsyncTask extends AsyncTask<
Integer/*맨처음에 입력하는 변수의 데이터타입*/,
Integer/*작동하는 동안 오가는 데이터타입*/,
String/*최종적으로 호출하는 함수에 넘길 데이터타입 */>{
/**
* 시작전에 호출되는 메소드
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
editText.setText("AsyncTask Start!!\n");
}

/**
* 작동하는 동안 호출되는 메소드
* @param value 중간중간에 바뀔 때 넘어오는 값
*/
@Override
protected void onProgressUpdate(Integer[] value) {
super.onProgressUpdate(value);
int cnt = value[0]; // cnt를 소환 배열로 들어왔으니 배열로 받아서 사용한다.
editText.setText(editText.getText().toString()+"\n"+"cnt : "+cnt+" value : "+value[1]);
}

/**
* 모두다 끝나고 나면 호출되는 메소드
* @param value doInBackground에서 보내주는 데이터를 받는다.
*/
@Override
protected void onPostExecute(String value) {
// super.onPostExecute(value);
if(value.equals("SUCCESS")){ // SUCCESS의 경우 한줄을 추가함
editText.setText(editText.getText().toString()+"\n"+value);
}

}

/**
* 뒤에서 돌아가는 메소드 Thread의 역할을 한다.
* @param intArr 맨처음에 입력하는 데이터가 들어온다.
* @return
*/
@Override
protected String doInBackground(Integer[] intArr) {
int cnt = 0;
int value = intArr[1]; // 배열로 가져와서 사용
while (true){
cnt++;
publishProgress(cnt, value);//작동하는 중간중간에 onProgressUpdate 호출
// (넘어가는 파라미터는 배열형식으로 넘길 수 있음)
SystemClock.sleep(1000); //1초에 1씩 증가
if(cnt == 60) break; // 60초에서 반복문 종료
}
return "SUCCESS"; // onPostExecute로 넘길 데이터 String값이다.
}


}



이 소스는 git에서도 확인이 가능합니다.


https://github.com/geusan/dco_android_thread_asynctask