temporaryなめも帳

だらだらと備忘録とか。誰かの為になることをねがって。

AsyncTaskのonPreExecuteについて

onPreExecuteはUIスレッドで実行される。というのをきちんと意識できてなく変なバグを生んだので自戒を込めて。

onPreExecuteはUIスレッドで実行されます。実行のタイミングとしては、AsyncTask.execute()を呼び出した後

public final AsyncTask<Params, Progress, Result> execute(Params... params) {
    return executeOnExecutor(sDefaultExecutor, params);
}

そのままexecuteOnExecutor()が呼び出され、

public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params) {
    if (mStatus != Status.PENDING) {
        switch (mStatus) {
            case RUNNING:
                throw new IllegalStateException("Cannot execute task:"
                        + " the task is already running.");
            case FINISHED:
                throw new IllegalStateException("Cannot execute task:"
                        + " the task has already been executed "
                        + "(a task can be executed only once)");
        }
    }

    mStatus = Status.RUNNING;

    onPreExecute();

    mWorker.mParams = params;
    exec.execute(mFuture);

    return this;
}

Executer内でonBackground()等が呼び出される前に、onPreExecuteが呼び出されている。 つまりonPreExecute()はAsyncTask.execute()内で同期的に実行される。

ここへ負荷の高い処理を持ってくると、意味が無くなってしまう。気を付けましょう。