일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 안드로이드 유닛 테스트
- 클래스
- 멤버변수
- 자바 다형성
- 안드로이드 os 구조
- 안드로이드 레트로핏 crud
- rxjava cold observable
- 안드로이드 라이선스 종류
- rxjava hot observable
- 안드로이드 유닛테스트란
- android retrofit login
- 안드로이드 유닛 테스트 예시
- jvm 작동 원리
- Rxjava Observable
- 스택 큐 차이
- 안드로이드 라이선스
- jvm이란
- 2022 플러터 설치
- ANR이란
- 서비스 vs 쓰레드
- 안드로이드 레트로핏 사용법
- 2022 플러터 안드로이드 스튜디오
- rxjava disposable
- 큐 자바 코드
- 서비스 쓰레드 차이
- 플러터 설치 2022
- ar vr 차이
- 객체
- 스택 자바 코드
- android ar 개발
- Today
- Total
나만을 위한 블로그
[Android] AsyncTask란? 본문
디벨로퍼 사이트 내용 한글로 정리
https://developer.android.com/reference/android/os/AsyncTask
AsyncTask를 쓰면 UI 쓰레드를 적절하고 쉽게 쓸 수 있다. 이 클래스를 쓰면 쓰레드 or 핸들러를 조작하지 않고도 백그라운드 작업을 수행하고 UI 쓰레드에 결과를 게시할 수 있다.
AsyncTask는 쓰레드, 핸들러에 대한 도우미 클래스로 설계됐으며, 일반적인 쓰레딩 프레임워크를 구성하지 않는다. AsyncTask는 짧은 작업(최대 몇 초)에 사용되는 게 이상적이다.
오랫동안 쓰레드를 계속 실행해야 하는 경우 java.util.concurrent 패키지에서 제공하는 Executor, ThreadPoolExecutor, FutureTask 등의 다양한 API를 쓰는 것이 좋다.
비동기 작업은 백그라운드 작업에서 실행되고 결과가 UI 쓰레드에 게시되는 계산에 의해 정의된다. 비동기 작업은 Params, Progress, Result라는 3개의 일반 유형과 onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute()라는 4단계 함수로 정의된다.
-> AsyncTask는 쓰레드나 핸들러를 만들지 않고도 백그라운드에서 작업을 수행하고 그 결과를 메인 쓰레드에 출력할 수 있도록 해주는 클래스다. 작업은 비동기로 이뤄지며 doInBackground()를 필수로 구현해야 한다. 나머지 함수들은 선택적으로 사용하면 된다. 사용되는 인자는 Params, Progress, Result라는 3개의 유형이 있다.
- 사용법
AsyncTask를 쓰려면 서브 클래스로 만들어져야 한다. 이 서브 클래스는 최소한 하나의 함수(doInBackground())를 오버라이딩해야 하며, 대부분 자주 2번째 함수로 onPostExecute(Result)를 사용한다. 아래는 디벨로퍼에서 제시하는 사용 예시다.
위와 같이 AsyncTask의 작업 내용을 정의했다면 실행은 아래와 같이 한다.
- AsyncTask의 제네릭 인자 유형
AsyncTask에 사용되는 3가지 제네릭 유형은 다음과 같다.
- Params : 실행 시 task로 전송되는 매개 변수의 유형, doInBackground()의 매개변수 타입, execute()의 인자값이 된다.
- Progress : 백그라운드 계산 중 게시된 진행률 단위의 유형, doInBackground() 작업 시 진행 단위의 타입으로 onProgressUpdate() 파라미터 타입이다.
- Result : 백그라운드 계산 결과의 유형, doInBackground()의 리턴값, onPostExecute() 파라미터 타입이다.
모든 유형이 항상 AsyncTask에서 사용되는 것은 아니다. 해당 유형을 쓰지 않는 것으로 표시하려면 Void를 써라.
-> AsyncTask에는 Params, Progress, Result라는 3가지 제네릭 유형이 있다. Params는 실행 시 AsyncTask로 전송되는 매개 변수의 유형을 정의한다. 매개 변수의 유형이란 Integer, String 등의 자료형을 의미한다. Progress는 AsyncTask가 실행되며 계산하는 중 출력되는 진행률을 단위로 하는 유형이다. Result는 백그라운드에서 진행되던 작업이 종료되면 결과값을 나타내는 유형이다. 세 유형 모두 기본형을 쓰지만 소문자로 쓰는 것이 아니라 첫 문자를 대문자로 써야 하는 것에 주의하자.
- AsyncTask의 4단계 함수
AsyncTask가 실행될 때 작업은 4단계를 거친다.
1. onPreExecute() : 작업이 실행되기 전에 메인 쓰레드에서 호출됨, 이 단계는 일반적으로 사용자 인터페이스에 진행률 표시줄을 나타내 작업을 설정하는 데 사용된다.
2. doInBackground(Params...) : onPreExecute()의 실행이 완료된 후 백그라운드 쓰레드에서 호출된다. 이 함수는 시간이 오래 걸릴 수 있는 백그라운드 계산을 수행하는 데 사용된다. AsyncTask의 매개변수가 이 함수로 전달된다. 계산 결과는 이 단계에서 반환되야 하며, 마지막 단계로 다시 전달된다. 이 함수에서는 publishProgress(Progress…)를 써서 하나 이상의 진행 단위를 게시할 수도 있다. 이 값은 onProgressUpdate(Progress...) 단계에서 메인 쓰레드에 출력된다.
3. onProgressUpdate(Progress…) : publishProgress(Progress…)를 호출한 후 메인 쓰레드에서 호출된다. 실행 시기는 정의돼 있지 않다. 이 함수는 백그라운드 계산이 아직 실행중인 동안 UI에서 모든 형태의 진행을 표시하는 데 사용된다. 예를 들어 진행률 표시 줄에 애니메이션을 적용하거나 텍스트 필드에 로그를 표시하는 데 쓰일 수 있다.
4. onPostExecute(Result) : 백그라운드 계산이 끝난 후 메인 쓰레드에서 호출된다. 백그라운드 계산 결과는 이 함수의 매개변수로 전달된다.
- 작업 취소
cancel(boolean)을 호출해 언제든 작업을 취소할 수 있다. 이 메서드를 호출하면 isCancelled()에 대한 후속 호출이 true를 리턴한다. 이 함수를 호출한 후 doInBackground(java.lang.Object[])가 리턴된 후 onPostExecute(java.lang.Object) 대신 onCancelled(java.lang.Object)가 호출된다. 작업이 최대한 빨리 취소되게 하려면 가능하면(루프 안에서라든가) doInBackground(java.lang.Object[])에서 isCancelled()의 리턴값을 주기적으로 확인해야 한다.
- 쓰레딩 규칙
AsyncTask 클래스가 제대로 작동하려면 몇 가지 쓰레딩 규칙을 따라야 한다.
1. AsyncTask는 메인 쓰레드에 로드해야 한다. 이는 젤리빈 이상부터 자동으로 수행된다.
2. AsyncTask의 객체는 메인 쓰레드에서 작성해야 한다.
3. 메인 쓰레드에서 execute(Params…)를 호출해야 한다.
4. 수동으로 onPreExecute (), onPostExecute (Result), doInBackground (Params ...), onProgressUpdate (Progress ...)를 호출하지 마라.
5. AsyncTask는 한 번만 실행될 수 있다. 1번 이상 실행 시 예외 발생.
- 메모리 관찰성
AsyncTask는 모든 콜백 호출이 동기화되서 명시적 동기화 없이 다음을 보장한다.
- onPreExecute()의 메모리 효과 및 AsyncTask 객체 생성을 포함해 execute(Params…)를 호출하기 전에 실행된 모든 것은 doInBackground(Params…)에 표시된다.
- doInBackground(Params…)의 메모리 효과는 onPostExecute(Result)에 표시된다.
- publishProgress(Progress…)를 호출하기 전에 doInBackground(Params…)의 모든 메모리 효과는 해당 onProgressUpdate(Progress…) 호출에 표시된다. 하지만 doInBackground(Params...)는 계속 실행되며 doInBackground(Params…)의 후속 업데이트가 진행중인 onProgressUpdate(Progress...) 호출을 방해하지 않게 주의해야 한다.
- cancel(boolean) 호출 이전의 메모리 효과는 결과로 true를 리턴하는 isCancelled() 호출 후 or onCancelled()에 대한 호출 결과 및 호출 후에 표시된다.
- 실행 순서
처음 AsyncTask가 소개됐을 때 AsyncTask는 단일 백그라운드 쓰레드에서 순차 실행되었다. 도넛 버전부터는 여러 작업을 병렬 수행할 수 있는 쓰레드 풀로 변경됐다. 허니컴 버전으로 시작하면 병렬 실행으로 인한 일반적인 앱 오류를 피하기 위해 단일 쓰레드에서 작업이 실행된다. 병렬 실행을 원한다면 THREAD_POOL_EXECUTOR를 써서 executeOnExecutor(java.util.concurrent.Executor, java.lang.Object[])를 호출할 수 있다.
'Android' 카테고리의 다른 글
[Android] ArrayAdapter란? (0) | 2019.12.01 |
---|---|
[Android] runOnUiThread란? (0) | 2019.11.30 |
[Android] Cannot open a library at FileMapping 에러 (0) | 2019.11.26 |
[Android] 태그란? (0) | 2019.11.25 |
[Android] 핸들러란? 루퍼란? (0) | 2019.11.25 |