Android AsyncTask의 바뀐 쓰레드 스케줄링에 대해서…

안드로이드 허니콤 버전(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

public static final Executor SERIAL_EXECUTOR An Executor that executes tasks one at a time in serial order.
public static final Executor 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();

Android AsyncTask의 바뀐 쓰레드 스케줄링에 대해서…”에 대한 2개의 생각

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.