안드로이드에서 네트워크 통신 기능을 구현하기 위해서는 동기적으로 구현하지 못하게 막았습니다. 언제 응답이 올지 모르기 때문에 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...); |
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) Activity 에서 이미지 리소스 drawable 다루는 방법 (4) | 2024.04.28 |
---|---|
안드로이드 콘솔에서 adb shell 패키지 접근 권한 Permission denied 에러 해결 (1) | 2024.04.11 |
안드로이드 개발 Intent 이용한 전화 걸기 (5) | 2024.03.23 |
안드로이드(Android) scale 이용해서 애니메이션(Animation) 구현하는 방법 (2) | 2024.03.07 |
안드로이드(Android) ProgressDialog(프로그레스 다이얼로그) 구현 방법 (9) | 2024.03.06 |
안드로이드 개발 ContentProvider, ContentResolver 이용해서 연락처 가져오는 방법 (3) | 2024.02.09 |
안드로이드 스튜디오 개발 APK 파일 찾는 방법 (0) | 2023.07.10 |
안드로이드(Android) ImageView scale type 별로 이미지 배치 하는 방법 (0) | 2023.01.24 |