0. History
- 이 번역 글은 2012-01-20 초안 작성 시작하였습니다.
- 잘못된 번역, 오래된 정보, 오타가 있다면 Comment 남겨주세요. 확인 후 수정하겠습니다.
- 이 번역 글은 2012-01-22 초안 작성 완료하였습니다.
1. Intro
왜 AsyncTask 파트를 번역하시나요?
AsyncTask 관련 글들을 쓰면서 Android Developer Guide 를 참조하였습니다.
[Tutorial] 쉽게 사용하는 Thread와 Handler. AsyncTask class 를 통해 해보아요~ (개념)
[Tutorial] 예제를 통해 배우는 AsyncTask. 함께 배워보아요.
정리해서 쓴다고 썼지만, 그래도 놓치는 부분도 많고, 제가 정리한 것보다는 전문적으로 작성되고 공개된 글을
읽어 보는 것이 더 많은 것을 배울 수있다고 판단하여 번역을 시작하였습니다.
게다가 프로그래밍에 대한 학습의욕은 넘치나 영어 읽기가 귀찮은 분들을 위해서,
Android Developer 에서 제공하는 문서 중 Guide 파트를 번역하였습니다.
번역 Article 의 주소는..
http://developer.android.com/reference/android/os/AsyncTask.html
2. Information.
public abstract class AsyncTask<Params, Progress, Result> extends Object;
Class Overview
AsyncTask는 UI thread 를 쉽고 정확하게 사용할 수 있게 해줍니다. 이 class 는 thread 와 handler 를 사용하지 않고도 background 작업을 하고, 그 결과를 UI thread 에 반영할 수 있게 도와줍니다.
Asynchronous Task는 background thread 에서 작업을 하고, 그 결과를 UI thread 에 반영시킵니다. Asynchronous Task는 3가지 generic type인 Params, Progress 그리고 Result와 4가지 단계인 onPreExecute, doInBackground, onProgressUpdate, onPostExecute 와 함께 작동합니다.
Developer Guides
Task와 Thread에 대한 더 자세한 내용은 Processes and Threads 라는 이름의 developer guide를 참조하세요.
Usage
AsyncTask는 반드시 subclass 되어서 사용되어야 합니다. Subclass 는 적어도 하나의 함수, doInBackground(Params...)를 override 하여 사용하며, 주로 onPostExecute(Result)도 함께 override 하여 사용합니다.
여기에 subclass 에 대한 예제가 있습니다.
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>{
protected Long doInBackground( URL... urls ){
int count = urls.length;
long totalSize = 0;
for ( int i = 0; i < count; i++ ){
totalSize += Downloader.downloadFile( urls[ i ] );
publishProgress( (int) ( ( i / ( float ) count ) * 100 ) );
}
return totalSize;
}
protected void onProgressUpdate( Integer... progress ){
setProgressPercent( progress[ 0 ] );
}
protected void onPostExecute( Long result ){
showDialog( "Downloaded " + result + " bytes";
}
}
한번 생성되면 task 는 다음과 같이 간단하게 실행됩니다.
new DownloadFilesTask().execute( url1, url2, url3 );
AsyncTask's generic types
Asynchronous task에 쓰이는 3가지 generic types 는 다음과 같습니다.
1. Params, 실행되면 Task에 전달되는 파라미터들입니다.
2. Progress, background 작업 중에 전달되는 progress unit 입니다.
3. Result, background 작업의 결과로 전달되는 type 입니다.
모든 타입이 항상 asynchronous task 에 사용되는 것은 아닙니다.
사용하지 않는다는 것을 표기하기 위해서는 간단히 Void 로 표기합니다.
private class MyTask extends AsyncTask<Void, Void, Void>{ ... }
The 4 steps
Asynchronous task 가 수행될 때 다음과 같은 4가지 step을 거칩니다.
1. onPreExecute(), 이것은 UI thread 에서 실행 명령을 내리지 마자 호출됩니다. 이 단계는 보통 task에 대한 setup을 하는데 사용됩니다. 예를 들면 UI 에 progress bar 를 보여주는 것이 그것입니다.
2. doInBackground( Params... ), 이것은 onPreExecute() 의 실행이 끝나자마자 background thread에서 바로 호출되어 작업을 수행합니다. 이 단계는 background 계산을 하기 위해 사용되며 오랜 시간이 걸릴 수 있습니다. Asynchronous task 의 parameter 들은 이 단계에 전달됩니다. 그리고 그 연산 결과는 마지막 단계로 전달이 됩니다. 이 단계에서는 publishProgress( Progress... ) 도 사용합니다. 이 녀석은 중간 progress 를 onProgressUpdate( Progress... ) 단계를 통해 UI thread 에 전달합니다.
3. onProgressUpdate( Progress... ), 이녀석은 publishProgress( Progress... )를 통해 UI thread에서 호출됩니다. 이 녀석이 호출되는 타이밍은 정해지지 않았습니다. 이 함수는 background 작업을 하는 도중에 UI에 progress 를 display 하기 위해 사용됩니다. 예를 들면 progress bar를 움직이거나, text field에 log 를 찍는 작업을 합니다.
4. onPostExecute( Reuslt ), 이 녀석은 background 작업을 마쳤을 때 UI thread 에서 불립니다. Background 작업의 결과가 이 녀석의 parameter 로 전달딥니다.
Cancelling a task
Task는 언제든지 cancel( boolean ) 을 통해서 취소될 수 있습니다. 이 함수를 호출하는 것은 isCancelled() 의 결과를 true 로 바꾸어줍니다. cancel( boolean ) 함수의 호출은 doInBackground(Object[] ) 의 작업 완료 후, onPostExecute( Object ) 대신 onCancelled( Object ) 를 호출합니다. Task를 최대한 빨리 취소시키기 위해서는 doInBackground( Object[] ) 에서 항상 isCancelled()를 주기적으로 check를 해줘야 합니다. ( 예를 들면 loop 안에서 )
Threading rules
AsyncTask 를 올바르게 사용하기 위해서는 다음과 같은 몇개의 threading 규칙이 반드시 지켜져야 합니다.
- Task 객체는 반드시 UI thread 에서 만들어져야만 합니다.
- execute( Params... ) 는 반드시 UI thread에서 호출 되어야 합니다.
- onPreExecute(), onPostExecute( Result ), doInBackground( Params... ), onProgressUpdate( Progress... ) 를 직접 호출하지 않습니다.
- Task의 수행은 한번만 호출 될 수 있습니다. ( 만약 두번 실행하려 한다면 exception 이 발생합니다. )
Memory observability
AsyncTask는 다음과 callback call들이 명백한 동기화 작업 없이도 동기화되어 수행되는 것을 보장합니다.
- 생성자와 doPreExecute()에서의 member 변수 설정과 doInBackground( Params.. ) 에서의 참조.
- doInBackground( Params... ) 에서의 member 변수 설정과 onProgressUpdate( Progress... )와 onPostExecute( Result ) 에서의 참조.
여기까지가 Andorid Developers Doc 에서 설명하고 있는 AsyncTask에 대한 개요입니다.
자세한 API List 와 그 사용법은 해당 사이트를 직접 참고하시길 바랍니다.
3. Tags
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Manifest Activity 의 속성 exported에 대해 알아보아요. (0) | 2012.01.23 |
---|---|
[Android/안드로이드] Manifest Activity 의 속성 ConfigChanges 에 대해 알아보아요. (0) | 2012.01.23 |
[Android/안드로이드] 예제를 통해 배우는 AsyncTask. 함께 배워보아요. (5) | 2012.01.20 |
[Android/안드로이드] 쉽게 사용하는 Thread와 Handler. AsyncTask class 를 통해 해보아요~ (개념) (9) | 2012.01.19 |
[Android/안드로이드] 예제를 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요 #2 (5) | 2012.01.14 |
댓글