본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] 쉽게 사용하는 Thread와 Handler. AsyncTask class 를 통해 해보아요~ (개념)

by 돼지왕 왕돼지 2012. 1. 19.
반응형


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" 로 정의합니다.

ParamsdoInBackground에 전달되는 parameter의 type입니다.
ProgressonProgressUpdate에 전달되는 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

 
 





반응형

댓글