プログラマってこんなかんじ??

アプリ作ったり歌ったりしてます

AsyncTask の挙動(AsyncTask#executeOnExecutor) その2

前回のエントリで AsyncTask#execute の挙動がAPI Levelによって違う、とわかりました。


では、どこで切り替えているのか。


てなことを twitter上 でぎゃーぎゃー言ってたら
@zaki50さん から情報をいただきました!
(@zaki50さん、ありがとうございます!)

参考

日本Androidの会 - API LEVEL 11以上のAsyncTaskの振る舞いについて


というわけで ICSの ActivityThread.java を読んでみました。
ソースの該当箇所はココ。

// android.app.ActivityThread
private void handleBindApplication(AppBindData data) {

    // 抜粋

    // If the app is Honeycomb MR1 or earlier, switch its AsyncTask
    // implementation to use the pool executor.  Normally, we use the
    // serialized executor as the default. This has to happen in the
    // main thread so the main looper is set right.
    if (data.appInfo.targetSdkVersion <= 12) {
        AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

思いっきり書いてあります。
ココで切り替えてたのですねー。。


このソース内、他にも Honeycomb以前だったら判定とか StrictMode設定だったりとか。
いろんなことやってるのがチラチラ見えたのでもっと細かく読んでみようと思います。
恥ずかしい話、ActivityThread は Looperの起動 くらいしか思っていなかったですw