AsyncTask 실행을 AsyncTaskCompat에 맡기자.

안드로이드 앱이 허니콤(3.0) 이전 버전의 OS를 지원하고, AsyncTask를 사용한다고 가정해보자. 이 경우에 허니콤 이전버전의 기본 메서드인 execute()를 실행하는 디스패처가 다중 스레드를 사용해서 처리하고, 허니콤 부터는 단일 스레드를 사용해서 처리한다. 그래서 OS별 AsyncTask의 기본 태스크 디스패처로 SERIAL_EXECUTOR 또는 THREAD_POOL_EXECUTOR를 사용하는지 알아야 한다. 종종 허니콤 이전에서 execute()를 사용해서 다중 스레드를 사용하고 있었는데, 허니콤 이후부터는 단일 스레드로 태스크가 처리가 되서 당황스러운 경우가 종종 발생한다. 그래서 다중 스레드로 태스크를 처리하는 좀 더 명확한 메서드를 Support v4 버전에서 제공하고 있다. 이 클래스가 AsyncTaskCompat 이다. 이 클래스가 제공하는 메서드는 다음과 같다.

public static AsyncTask<Params, Progress, Result> executeParallel (AsyncTask<Params, Progress, Result> task, Params... params)

이 팩토리 형태의 메서드를 사용해서 AsyncTask를 실행요청하면 요청한 AsyncTask 객체를 돌려주기 때문에 취소등의 요청을 위해서 AsyncTask 객체를 유지하기 위해서 좀 더 깔끔한(?) 코드의 모습을 보게된다. 그럼, 이 메서드의 구현을 살펴보자.

    /**
     * Executes the task with the specified parameters, allowing multiple tasks to run in parallel
     * on a pool of threads managed by {@link android.os.AsyncTask}.
     *
     * @param task The {@link android.os.AsyncTask} to execute.
     * @param params The parameters of the task.
     * @return the instance of AsyncTask.
     */
    public static <Params, Progress, Result> AsyncTask<Params, Progress, Result> executeParallel(
            AsyncTask<Params, Progress, Result> task,
            Params... params) {
        if (task == null) {
            throw new IllegalArgumentException("task can not be null");
        }

        if (Build.VERSION.SDK_INT >= 11) {
            // From API 11 onwards, we need to manually select the THREAD_POOL_EXECUTOR
            AsyncTaskCompatHoneycomb.executeParallel(task, params);
        } else {
            // Before API 11, all tasks were run in parallel
            task.execute(params);
        }

        return task;
    }

위 코드를 보면, 허니콤 이후의 버전과 이전의 버전에서 실행하는 모습이 다른것을 알 수 있다. 그리고 이 메서드를 사용해서 코드가 좀 더 간결해 질 수 있다.

답글 남기기

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