안드로이드 With Java #26 AsyncTask
현재는 AsyncTask를 Android 측에서 deprecated 시켜서 사용하지 않는 것이 좋을 것 같다. 현재는
java.util.concurrent를 대신 사용하라고 권장되고 있다. https://developer.android.com/reference/android/os/AsyncTask
안드로이드에서는 UI 쓰레드를 정지 시켜둘 수 없기 때문에 Background 작업이 필요한 경우를 위해 AsyncTask를 지원한다.
어떤 작업이 완료되어서 결과값을 받을 때 까지 다음 작업을 실행하지 않음.
동시다발적으로 작업이 시작되고, 작업이 완료되는대로 결과값을 받음.
background 작업이 시작되기 전에 호출된다.
background 작업 구간에 호출된다.
Params를 사용한다.doInBackground가 실행되는 도중에 호출된다.
Progress를 사용한다.doInBackground가 완료되면 호출된다.
Result를 사용한다.

위와 같이 Class를 생성하고, AsyncTask 클래스를 상속하면 된다. 그리고 상속 뒤에 제너릭 타입들은 AsyncTask에서 파라미터로 설정될 타입이다.
이번 예제에서는 간단하게 로딩바를 구성할 것이기 때문에 셋 다 Integer로 세팅해두었다.
AsyncTask를 사용한다는 것은 백그라운드에서 무언가를 하겠다는 이야기다.
그래서

위의 doInBackground() 메소드는 필수적으로 구현해주어야 한다. 위는 0에서 100까지 result 변수를 더하는 코드이고, 10의 배수가 될 때마다 publishProgress() 메소드를 이용하여 onProgressUpdate() 메소드로 연계한다.
파라미터에 Integer... integers 라고 쓰인 이유는 자바의 가변 파라미터 문법 때문에 그렇다. 자바의 가변 파라미터는 배열이 들어오긴 할 건데 그 크기가 얼마나 될지 모를 때 저런 형식으로 활용한다.

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

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

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

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

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

Progress가 10%씩 증가할 때마다 표기되고 마지막에 100이 표시되었다.
그리고 우리가 onCreate에서 만들어준 doSomeThing Asyncronously로그는 백그라운드에 진입하기도 전에 표기되었다.
AsyncTask를 다룰 때는 publishProgress()메소드만 잘 이용하면 될 것 같다.