Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) Thread 대신해서 AsyncTask 클래스 구현하기

안드로이드 개발

안드로이드(Android) Thread 대신해서 AsyncTask 클래스 구현하기

 

환경: Android Studio

 

안드로이드에서 네트워크 통신 기능을 구현하기 위해서는 동기적으로 구현하지 못하게 막았습니다. 언제 응답이 올지 모르기 때문에 UI 블록을 막기 위해서입니다. UI 는 Single Thread Model 을 따르기 때문입니다. 그러면 별도의 Thread 를 만들어서 비동기로 구현해야 하는데, 안드로이드에서는 AsyncTask 라는 Thread Class 를 제공합니다.

 

1. AsyncTask 클래스 소개

 

▼ AsyncTask에 해당하는 함수들의 생명주기는 다음과 같습니다. 주로 초기화는 onPreExecute() 에 들어가고 로직은 doInBackground() 에 구현합니다. AsyncTask 을 상속받아 만든 클래스는 반드시 doInBackground() 을 구현해야 합니다. 함수는 다음과 같은 순서로 실행됩니다.

 

onPreExecute() -> doInBackground(params) -> onProgressUpdate(Progress) -> onPostExecute(Result) -> onCancelled(Result)

 

l  onPreExecute() : 백그라운드 실행 이전에 동작 함수

l  doInBackground(params) : 실제 로직이 들어가는 함수, 사용자가 execute() 함수 실행할 때 넘긴 파라미터를 이용해서 동작 수행 함수

l  onProgressUpdate(Progress) : 실시간 작업의 진행 상황을 확인 함수

l  onPostExecute(Result) : 작업 종료 후 결과 반환하는 함수

l  onCancelled(Result) : 사용자가 특정 조건에서 실행하면 작업을 중단하면서 수행하는 함수

 

2. AsyncTask 3가지 제네릭(generic) 타입 정의 하기

 

▼ java 에서 generic 이란 클래스에서 사용할 타입을 외부에서 설정할 수 있도록 만든 것입니다. 3가지 제네릭 타입이 있는데 다음과 같습니다.

 

private class MyTask extends AsyncTask<Params, Progress, Result>

 

l  Params : doInBackground() 함수의 파라미터로 쓰인다. 사용자가 execute(Params) 함수를 호출하면서 넘기는 파라미터이다.

l  Progress : onProgressUpdate() 함수의 파라미터로 쓰인다.

l  Result : doInBackground() 백그라운드에서 계산한 결과의 반환값의 유형을 정의한다. onPostExecute() 의 파라미터로 사용된다. 그러니까 doInBackground() 의 반환값을 onPostExecute() 파라미터로 받는 것이다.

 

▼ 구글 안드로이드 개발 사이트에서 참고한 소스입니다. AsyncTask 클래스를 상속해서 만든 것입니다.


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));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
}

 

3. 여러가지 규칙

 

(1) 화면 UI 로딩이 완료된 상태에서 실행해야 한다.

(2) 객체는 반드시 UI 스레드에서 생성해야 한다.

(3) AsyncTask 객체를 실행하기 위해서는 execute() 함수를 호출한다.

(4) AsyncTask 의 onPreExecute, doInBackground, onPostExecute 등은 호출하지 않는다.

 

4. 사용하기

 

▼ 사용 규칙에서도 이야기했지만 execute() 함수를 호출해야 합니다. 그리고 파라미터는 제너릭에서 첫 번째에 해당하는 타입이며, 여러개의 데이터를 콤마로 구분해서 한번에 넘길 수 있습니다.

 

new DownloadFilesTask().execute(Param1, Param2, Param3...);



Posted by 녹두장군

댓글을 달아 주세요