[Kotlin] AsyncTask

Taeyang Lee·2020년 9월 1일
0

Kotlin

목록 보기
7/10

Task란 작업을 의미하는 최소 단위이다.

  • 운영체제 입장에서의 Task 처리 주체 : 프로세스
  • 프로세스 입장에서의 Task 처리 주체 : 스레드

Task 처리 모델에는 ① 동기식(Synchronous) 처리 모델② 비동기식(Asynchronous) 처리 모델이 있다.

① 동기식(Synchronous) 처리 모델 : 순차적으로 작업을 처리
② 비동기식(Asynchronous) 처리 모델 : 병렬적으로 작업을 처리

1. AsyncTask 구조

AsyncTask는 비동기 처리를 할 수 있도록 스레드와 핸들러 기능을 하나의 클래스에 합쳐놓은 것이다.

  • AsyncTask에서 구현해야 되는 3가지 인터페이스
    ① doInBackground( ) : 백그라운드 스레드 역할로 이 블럭 안의 코드만 백그라운드에서 실행된다.
    ② onProgressUpdater( ) : doInBackground( ) 블럭에서 publishProgress( )가 호출될 때마다 실행된다. 파일 다운로드 시에 현재 진행률을 보여주는 형태로 많이 사용된다.
    ③ onPostExecute( ) : doInBackground( )의 코드가 완료된 후에 호출된다. 파일 다운로드를 하는 로직이라면 다운로드 완료 처리를 이 메서드에 하면 된다.

1) AsyncTask<Params, Progress, Result>
AsyncTask 클래스를 정의할 때 3가지 제네릭을 지정한다. AsyncTask 구현 메서드의 인자 타입은 제네릭으로 결정된다.

제네릭설명
ParamsdoInBackground( ) 메서드가 전달받은 인자 타입
ProgressonProgressUpdater( )메서드가 전달받은 인자 타입
ResultonPostExecute( ) 메서드가 전달받은 인자 타입

2) doInBackground(vararg params: Params?): Result
doInBackground( ) 메서드는 작업을 시작하면 호출되고 백그라운드 스레드에서 동작한다.

  • excute( ) 메서드로 전달된 인자를 받을 수 있다.
  • publishProgress( ) 메서드로 작업 중인 데이터를 onProgressUpdate( ) 메서드에 전달할 수 있다.
  • 작업이 종료되면 onPostExcute( ) 메서드에 Result 타입의 값을 변환할 수 있다.

* 가변 인자 vararg : 선언된 타입의 값을 쉼표(,)로 구분해서 복수 개를 전달할 수 있다. 파라미터는 temp[0]과 같이 배열처럼 사용할 수 있다.

3) onProgressUpdate(vararg values: Progress?)
doInBackground( ) 메서드 안에서 publishProgress( ) 메서드가 호출되면 실행된다. 메인 스레드에서 실행되므로 전달되는 파라미터 값으로 UI를 업데이트할 수 있다.

4) onPostExecute(vararg result: Result?)
doInBackground( )메서드가 Result 타입의 값을 반환하면 호출되는 메서드이며 메인 스레드에서 동작한다. 직업의 실행결과를 UI에 업데이트할 수 있다.

5) asyncTask.execute( )
스레드의 start( )와 같은 역할을 한다. AsyncTask를 실행하기 위해 반드시 호출되어야 한다.

2. AsyncTask 제약사항

① 한 번 실행한 AsyncTask는 다시 실행할 수 없고 새로운 AsyncTask를 생성해 실행해야 한다.
② AsyncTask를 사용해서 스케쥴링 할 수 있는 작업 수의 제한이 있고 몇 초 정도의 짧은 작업에서만 이상적으로 동작한다는 한계가 있다.
③ 안드로이드 버전 별로 병렬 처리 동작이 다르므로 허니콤 이후 버전에서 멀티 스레드 작업을 원한다면 AsyncTask를 실행할 때 AsyncTask.THREAD_POOL_EXECUTOR 스케줄러를 지정해야 한다.




(☞゚ヮ゚)☞ [참고서적] 이것이 안드로이드다 with 코틀린 / 고돈호 / 한빛미디어
profile
Tyangpedia

0개의 댓글