안드로이드 허니콤 버전(3.2 이상에서 테스트)에서는 AsyncTask의 쓰레드 스케줄러가 바뀌었나 봅니다. 기존에 동작하던 AsyncTask들이 싱글 쓰레드처럼 동작합니다.. ^^;;
AsyncTask는 보통 API를 호출하면서, 데이터를 받아오거나, UI 쓰레드와 별도로 동작해야 하는 작업을 위해서 사용을 해서 찾는데 시간이 좀 걸렸네요.. 아융.. 자꾸 삽질을..
기존의 AsycnTask를 사용하는 형태를 보면, AsyncTask를 상속한 클래스를 생성하고 실행을 하면, 기본적으로 멀티 쓰레드가 Concurrent하게 동작을 했었습니다.
new MyAsyncTask().executeOnExecutor(“”);
하지만, 허니콤 이상에서는 멀티 쓰레드가 Concurrent하게 동작을 하지 않고, 싱글 쓰레드가 동작하는 것처럼 동작을 하네요.. 아래의 AsyncTask에 대해서 설명하는 API문서를 살펴보니, 11버전부터 쓰레드를 스케줄링하는 넘이 2개가 추가되어 있네요..
http://developer.android.com/reference/android/os/AsyncTask.html
SERIAL_EXECUTOR | An Executor that executes tasks one at a time in serial order. |
|
THREAD_POOL_EXECUTOR | An Executor that can be used to execute tasks in parallel. |
허니콤의 3.2버전에서는 AsyncTask의 쓰레드는 SERIAL_EXECUTOR가 디폴트로 스케줄링하나 봅니다.. 그래서, 멀티 쓰레드로 Concurrent하게 데이터를 가져오거나 동작하게 하기 위해서는, 아래와 같이 AsyncTask를 실행할 때, AsyncTask.THREAD_POOL_EXECUTOR 스케줄러를 지정하면 됩니다..
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, “”);
흠, 잘 동작합니다… ^^
추가적으로, 여러 버전으로 타켓팅해서 배포하기 위해서는 아래의 코드를 사용해도 좋겠습니다. ^^
MyAsyncTask mTask = new MyAsyncTask();
if(Build.VERSION.SDK_INT >= 11)
mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, “”);
else
mTask.execute();
좋은 글 감사합니다^^
감사합니다..!