안드로이드 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()
메소드만 잘 이용하면 될 것 같다.