본문 바로가기

안드로이드

쉬운 안드로이드 쓰레드 관리 Class - AsyncTask Android

쉬운 안드로이드 쓰레드 관리 Class - AsyncTask  Android 

2010/10/29 09:06

복사http://blog.naver.com/dythmall/30096230387

보통 안드로이드에서 쓰레드 작업은 오래 걸리는 일을 UI쪽 쓰레드를 방해하지 않으면서 진행하기 위해서 쓰여진다
그림은 다운또는 업로드 하거나
데이터 베이스 작업을 하거나
파일 작업을 하거나 등등등

이때 쓰레드를 돌리면서 UI를 변경해 주어야 할때가 있다
전에 포스팅에서 하나의 방법을 쓴적이 있다

그때의 방법은 우리가 직접 쓰레드 객체를 생성하고 관린를 할때 였다.
안드로이드에서 AsyncTask는 쓰레드 관리와 UI Thread와의 통신은 원활하게 도와주는 Wrapper Class이다.

 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");
     
}
 
}
위의 코드는 http://developer.android.com/reference/android/os/AsyncTask.html 에서 발취한 것이다.
우선 AsyncTask를 쓰려면 Subclassing을 해야한다
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
이 부분에서 <URL>은 새로운 쓰레드에게 전해주는 인자라고 보면 된다.  
Integer는 쓰레드의 작업이 얼마정도 진행 됫는지를 알려주는 인자의 객체이고
Long은 마지막 결과를 가지고 오는 인자이다. 

이 세개의 타입들은 어떤 Object도 될 수 있다.
이 세개가 항상 다 필요 한것은 아니다 (사실 모두필요 없을 수도 있다) 그럴 경우에는 Void를 쓰면 된다.

AsyncTask에서 꼭 Override해주어야 하는 함수는 doInBackground(Params... params) 이다.
이 함수안에 있는코드는 UI쓰레드가 아닌 다른 쓰레드에서 실행 된다.
위에서 말한 시간이 걸리는 작업들을 여기서 하면 되는것이다.

onProgressUpdate(Integer... progress)은 중간중간 작업의 진행정도를 알릴때 사용되는 함수이다 
이 함수의 호출은 내가 직접하는 것이 아니다.  이 함수를 호출 하려면 doInBackground에서 
publishProgress를 호출해 주면 되는것이다.  이유인즉, 아다싶히 다른 쓰레드에서 UI를 직접 바꾸는 것은 허용되지 않는다.
onProgressUpdate는 보통 UI를 직접 바꾸는 코드를 가지고 있을 것이고 그것을 직접 doInBackground에서 부르는 것은 허용되지 않는다.
publicProgress는 아마도 UIThread에 onProgressUpdate을 posting해주는 역할을 할것이다. 
이 함수는 UI 쓰레드에서 실행 된다.

onPostExecute(Long result)은 마지막에 doInBackground 함수가 작동을 마치면 실행되는 함수이다.
역시 UI 쓰레드에서 실행 된다.

여기서 중요한 점은 DownloadFilesTask(AsyncTask)를 꼭 UI 쓰레드 안에서 만들고 실행 시켜야 된다.

new DownloadFilesTask().execute(url1, url2, url3);
이런식으로 실행을 할 수 있다. 
다른 Override할 수 있는 함수들도 몇 있니 가서 한번 읽어보기 바란다.