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

[Android/안드로이드] Android Developer AsyncTask 파트 번역본입니다.

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

Android, android developer guide, Asynctask, backround, boolean, cancel, cancel task, doinbackground, example code, generic type, Guide, handler, iscancelled, Memory, onpostexecute, onpreexecute, onprogressupdate, params, process, publichprogress, subclass, task, thread, UI Thread, void, worker thread, [Android/안드로이드] Android Developer AsyncTask 파트 번역본입니다., 공개, 안드로이드, 예제 코드, 전문, 정리



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;
Since : API Level 3
 

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






반응형

댓글