안드로이드 With Java #26 AsyncTask

jakeseo_me·2020년 8월 19일
0

안드로이드 With Java

목록 보기
26/31

안드로이드 With Java #26 AsyncTask

현재는 AsyncTask를 Android 측에서 deprecated 시켜서 사용하지 않는 것이 좋을 것 같다. 현재는 java.util.concurrent를 대신 사용하라고 권장되고 있다. https://developer.android.com/reference/android/os/AsyncTask

AsyncTask 개념

안드로이드에서는 UI 쓰레드를 정지 시켜둘 수 없기 때문에 Background 작업이 필요한 경우를 위해 AsyncTask를 지원한다.

동기 작업의 개념

어떤 작업이 완료되어서 결과값을 받을 때 까지 다음 작업을 실행하지 않음.

비동기 작업의 개념

동시다발적으로 작업이 시작되고, 작업이 완료되는대로 결과값을 받음.

AsyncTask의 콜백함수

onPreExecute

background 작업이 시작되기 전에 호출된다.

doInBackground

background 작업 구간에 호출된다.

  • 변수의 타입으로 Params를 사용한다.

onProgressUpdate

doInBackground가 실행되는 도중에 호출된다.

  • 이를테면 로딩할 때 프로그래스바와 같은 것을 컨트롤 가능하다.
  • 변수의 타입으로 Progress를 사용한다.

onPostExecute

doInBackground가 완료되면 호출된다.

  • doInBackground에서 작업이 완벽하게 완료된 뒤에 수행된다.
  • 변수의 타입으로 Result를 사용한다.

AsyncTask 구현하기

위와 같이 Class를 생성하고, AsyncTask 클래스를 상속하면 된다. 그리고 상속 뒤에 제너릭 타입들은 AsyncTask에서 파라미터로 설정될 타입이다.

이번 예제에서는 간단하게 로딩바를 구성할 것이기 때문에 셋 다 Integer로 세팅해두었다.

필수 콜백함수 doInBackground() 구현하기

AsyncTask를 사용한다는 것은 백그라운드에서 무언가를 하겠다는 이야기다.

그래서

위의 doInBackground() 메소드는 필수적으로 구현해주어야 한다. 위는 0에서 100까지 result 변수를 더하는 코드이고, 10의 배수가 될 때마다 publishProgress() 메소드를 이용하여 onProgressUpdate() 메소드로 연계한다.

파라미터에 Integer... integers 라고 쓰인 이유는 자바의 가변 파라미터 문법 때문에 그렇다. 자바의 가변 파라미터는 배열이 들어오긴 할 건데 그 크기가 얼마나 될지 모를 때 저런 형식으로 활용한다.

onPreExecute() 구현하기

실행되는 것만 확인하기 위해 로그를 찍어보자.

onProgressUpdate() 구현하기

마찬가지로 로그를 찍어보았다.

onPostExecute 구현하기

여기도 결과만 로그로 찍어보았다.

MainActivity의 onCreate에서 실제로 클래스 만들고 실행해보기

만들어둔 클래스를 인스턴스화시키고 execute() 메소드를 통해 실행하면 된다.

라이프사이클 확인하기

예측한대로 라이프사이클이 수행되었다.

전체 로그 확인하기

Progress가 10%씩 증가할 때마다 표기되고 마지막에 100이 표시되었다.

그리고 우리가 onCreate에서 만들어준 doSomeThing Asyncronously로그는 백그라운드에 진입하기도 전에 표기되었다.

AsyncTask를 다룰 때는 publishProgress()메소드만 잘 이용하면 될 것 같다.

profile
대전에 있는 (주) 아이와즈에서 풀스택 웹개발자로 일하고 있는 서진규입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. Javascript를 좋아합니다.

0개의 댓글