1. Prerequisite & References
- Java 기초 지식.
- Android 기초 지식.
- Thread 에 대한 기초 지식
[Tutorial] 예제를 통해 배우는 AsyncTask. 함께 배워보아요.
2. Information.
AsyncTask 란게 뭐죠? 많이는 들어봤는데?
Prerequisite에 나와있듯, Java, Android, Thread 에 대해 기초가 있다는 가정하에 간단하게 이야기해보겠습니다.
Async를 이야기하려면 Sync도 이야기해야 합니다.
한국말로 Sync는 동기화, Async는 비동기화라고 이야기합니다.
프로그래밍 관점에서 말해봅시다.
for( int i = 0; i < 50000; i++ ){
// do long operation.
}
오래걸리는 작업을 5만번을 수행하라는 코드죠.
Sync 환경에서는 이 5만번을 수행하는 동안 아무 작업을 할 수 없습니다.
순차적이라는 말과 개념이 약간 비슷하죠. 저 작업이 모두 끝난 다음에 다음 작업을 수행합니다.
Async 환경에서는 이 5만번의 작업을 다른 Thread 에서 수행시킵니다.
그리고 저 작업을 끝날 때까지 현재의 Main Thread에서는 다른 작업을 수행할 수 있습니다.
물론 속도 자체는 Async 보다 Sync가 보통 빠릅니다만..
UI 환경에서는 저렇게 오래 걸리는 작업을 Sync로 수행하면 사용자의 UI 이벤트를 그동안 처리할 수 없습니다.
그럼 안되겠죠?
Android 는 UI ( User Interaction ) 가 있는 모바일 플랫폼이죠.
그러니 위와 같은 오래 걸리는 작업은 Main 이 아닌 다른 Thread 에서 작업이 되어야 합니다.
그럼 Thread 를 쓰지 왜 AsyncTask 를 쓰나요? 라는 질문이 들어오겠죠.
이 부분은 UI Thread 라는 개념을 알아야 합니다.
보통 UI Platform에서 UI에 관련된 작업은 UI Thread에서만 하게 되어 있습니다.
Android의 경우는 Main Thread가 UI Thread 가 같은 개념입니다.
그래서 Thread를 처리하던 중에 Main Thread에서 해야 할 일이 있다면.. ( 주로 UI 관련 작업 )
곤란해집니다.
이 때는 보통 Android에서 제공하는 Handler 라는 것을 이용하곤 합니다.
하지만 초보자들에게 이 Handler와 Thread를 사용하는 것은 구현하기도 어렵고 이해하기도 어렵습니다.
그래서 만들어 진 것이 바로 AsyncTask 입니다.
간단한 공식으로 이야기하면..
AsyncTask = Handler + Thread
입니다.
이 AsyncTask 가 Handler와 Thread 에 대한 직접적 Operation 없이
두가지 효과를 모두 낼 수 있도록 Wrapping 해놓은 class 라고 생각하시면 되겠습니다.
AsyncTask 는 언제 많이 쓰이나요?
AsyncTask 는 작업시간이 길어 Main Thread 또는 UI Thread 의 작업을 방해하는 경우에 주로 사용됩니다.
Thread 가 사용되는 경우와 보통은 일맥상통합니다.
그러나 AsyncTask 는 UI Thread에서의 작업도 필요한 경우에 주로 사용될 수 있겠습니다.
주로 Network 사용, File 저장 및 불러오기, Database query 등이 대표적인 경우입니다.
어떻게 사용하죠?
우선 AsyncTask 는 보통 상속하여 사용합니다.
public class DownloadTask extends AsyncTask< Params, Progress, Result >{
//...
}
상속을 하면서 AsyncTask 내부에서 사용할 3가지 parameter type을 정의합니다.
사용하지 않을 경우는 "Void" 로 정의합니다.
Params 는 doInBackground에 전달되는 parameter의 type입니다.
Progress 는 onProgressUpdate에 전달되는 parameter의 type입니다..
Result 는 onPostExecute에 전달되는 parameter의 type이면서 이 값은 doInBackground의 return 값입니다.
예제를 통해 보면 훨씬 쉽겠죠? Android developer 예제를 참조해 봅시다.
private class DownloadFilesTask extends AsyncTask< URL, Integer, Long >{
protected Long doInBackground( URL... urls ){
// do something
}
protected void onProgressUpdate( Integer ... progress ){
// do something
}
protected void onPostExecute( Long result ){
// do something
}
}
new DownloadFilesTask().execute( url1, url2, url3 );
자 이제 구체적 설명 들어갑니다. 위에서 볼 수 있는 3가지 function 이 AsyncTask에서 가장 많이 쓰이는 function들입니다.
doInBackground() 는 Main Thread가 아닌 별개의 Thread에서 작업을 합니다.
doInBackground는 AsyncTask.execute( params ) 를 통해서 수행이 되며
이 params 가 doInBackground의 parameter로 전달됩니다.
이 parameter의 type은 AsyncTask를 extends 하면서 정의해준 type 이어야 합니다.
onProgressUpdate() 는 doInBackground에서 일처리를 하다가
"중간에" UI Thread에서 처리할 일이 있는 경우에 불립니다.
doInBackground에서 수행되는 내용은 UI Thread에서 작동합니다.
doInBackground에서 명시적으로 publishProgress( progress ) 를 호출해주었을때 수행됩니다.
onPostExecute() 는 doInBackground의 처리가 모두 끝나고 해당 function이 return 되었을 때 호출됩니다.
AsyncTask가 취소되거나 예외 발생시에 parameter 로 null 이 들어옵니다.
이 onPostExecute 의 내용은 UIThread에서 수행됩니다.
추가적으로 onPreExecute() 가 있습니다. 이 녀석은
doInBackground가 수행되기 전, 즉 AsyncTask.execute() 를 호출했을 때 가장 먼저 수행되는 녀석입니다.
여기서는 보통 AsyncTask 에서 할 일에 대한 초기화 작업을 해주곤 합니다.
onPreExecute() 안의 내용은 UIThread에서 수행됩니다.
추가적으로 onCancelled() 가 있습니다. 이 녀석은 강제로 AsyncTask를 취소했을 대 호출됩니다.
아주 간단 정리하면 이렇습니다.
AsyncTask.execute() @ Main Thread
-> onPreExecute() @ Main Thread
-> doInBackground() @ Another Thread
-> onProgressUpdate() @ Main Thread. doInBackground에서 publishProgress() 호출시
-> onPostExecute() @ Main Thread. doInBackground() 가 return 되었을 때
모든 것은 예제를 통해 보는 것이 낫겠죠?
다음 글에서 간단한 예제와 함께 추가설명 해보겠습니다.
[Tutorial] 예제를 통해 배우는 AsyncTask. 함께 배워보아요.
3. Summary
- AsyncTask 는 Thread 와 Handler의 사용을 Wrapping 해논 class 입니다.
- AsyncTask는 MainThread와 다른 Thread 의 통신이 필요할 때 사용되며 쉽게 사용할 수 있습니다.
- AsyncTask는 주로 오래 걸리는 작업, 예를 들면 Network, Database 작업, File I/O 등에 주로 사용됩니다.
- AsyncTask의 수행은 execute( params ) 로 시작됩니다.
onPreExecute() 가 Main Thread에서 수행 된 후 이어 doInBackground() 가 다른 Thread에서 수행됩니다.
doInBackground()에서 작업 수행 중 publishProgress() 를 호출하면 onProgressUpdate() 가 Main Thread에서 호출됩니다.
doInBackground() 작업이 끝나면 onPostExecute() 가 Main Thread에서 수행됩니다.
- AsyncTask가 중간에 취소되었을 대는 onCancelled 가 호출됩니다.
4. References
- http://developer.android.com/reference/android/os/AsyncTask.html
Android developers AsyncTask doc.
- http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html
Android developers Process & Thread Dev Guide.
5. Tags
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Android Developer AsyncTask 파트 번역본입니다. (4) | 2012.01.20 |
---|---|
[Android/안드로이드] 예제를 통해 배우는 AsyncTask. 함께 배워보아요. (5) | 2012.01.20 |
[Android/안드로이드] 예제를 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요 #2 (5) | 2012.01.14 |
[Android/안드로이드] 개념을 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요. #1 (0) | 2012.01.14 |
[Java] String 을 + 로 연결하는 건 이제 그만! StringBuilder 로 간단하게 메모리와 퍼포먼스를 동시에 잡아보자. (2) | 2012.01.12 |
댓글