POST

[안드로이드] Kotlin 비동기 처리 AsyncTask

2022.01.28 - [Android] - [안드로이드] 코틀린 AsyncTask 연습 - 이미지 다운로드

AsyncTask란?

Task 처리 모델에는 동기식(Synchronous) 처리 모델과 비동기식(Asynchronous) 처리모델이 있습니다. 동기식 처리모델은 수차적으로 작업을 처리하는 모델로써 어떤 작업이 처리중이면 다음작업은 대기하지만, 비동기식 처리 모델은 병렬적으로 작업을 처리하며 어떤 작업이 처리 중이라도 대기하지않고 즉시 다음작업을 처리합니다. 처리 결과는 작업이 종료된 시점에서 받습니다.

 

AsyncTask 구조

AsyncTask는 비동기 처리를 할 수 있도록 스레드와 핸들러 기능을 하나의 클래스에 합쳐놓은 것입니다. 3개의 인터페이스를 구현하는 것만으로 핸들러와 서브스레드를 대체할 수 있습니다.

  • doInBackground(): 백그라운드 스레드 역할을 합니다. 이블럭안의 코드만 백그라운드에서 실행됩니다.
  • onProgressUpdate(): doInBackground() 블럭에서 publishProgress()가 호출될 때마다 실행됩니다. 파일 다운로드시 현재 징행율을 보여주는 형태로 많이 사용됨
  • onPostExecute(): doInBackground()의 코드가 완료된 후에 호출됩니다. 파일을 다운로드 한다면 다운로드 완료 처리를 이 메서드에서 하면 된다.

AsyncTask 의 제네릭

AsyncTask 클래스를 정의할 때 세가지의 제네릭을 지정합니다. 각각 Params, Progress, Result로  다양한 테이터 타입으로 지정이 가능합니다.

  1. Params: doInBackground() 메서드가 전달받는 인자 타입
  2. Progress: onProgressUpdate() 메서드가 전달받는 인자 타입
  3. Result: onPostExecute() 메서드가 전달받는 인자 타입
val asyncTask = object: AsyncTask<Void, Int, String>()

 

doInBackground(vararg params: Params?): Result

doInBackground() 메서드는 작업을 시작하면 호출되고 백그라운드에서 작업됨

  • execute() 메서드를 호출하여 전달하는 인자를 doInBackground()메서드로 받을 수 있다.
  • publishProgress() 메서드를 호출하여 작업중인 데이터를 onProgressUpdate()메서드에 전달할 수 있습니다.
  • 작업종료시 return 으로 onPostExecute() 메서드에 Result 값을 반환 할 수 있습니다.

onProgressUpdate(vararg values: Progress?)

doInBackground() 메서드에서 publishProgress()메서드가 호출되면 실행된다. 메인스레드에서 실행되어 전달되는 인자의 값으로 UI를 업데이트 할 수 있다.

 

onPostExecute(vararg result: Result?)

doInBackground()메서드가 Result타입의 값을 반환하면 호출되는 메서드이다. 메인스레드에서 동작하여 UI를 수정할 수 있다.

 

execute()

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

 

* vararg란? 가변인자로 메서드를 호출할때 타입의 값을 쉽표로 구분하여 복수개로 인자를 전달이 가능하며, temp[0]과 같이 배열처럼 사용이 가능하다.

 

AsyncTask의 제약사항

AsyncTask는 한번 실행한 것은 다시 실행 할 수 없고 새로운 AsyncTask를 생성해 실해해야한다.

AsyncTask를 사용해서 스케줄링 할 수 있는 작업의 수에 제한이 있으며 몇 초 정도의 짧은 작업에서만 이상적으로 동작한다는 한께가 있다.

안드로이드 버전 별로 병렬 처리 동작이 다르므로 허니콤 이후 버전에서 멀티 스레드 작업을 원한다면 AsyncTask를 실행 할 때 AsyncTask.TREAD_POOL_EXECUTOR 스케줄러를 지정해야 한다.