新しいノートブック

Android大好き

AsyncTaskについてメモ

Executor

■ AsyncTaskで選択出来る実行モード
・THREAD_POOL_EXECUTOR (パラレル実行)
・SERIAL_EXECUTOR (シリアル実行)

■ AsyncTask#execute() を実行した際の実行モード
・Gingerbread(2.x系)
THREAD_POOL_EXECUTORが採用される
・ICS以降(4.x系~)
SERIAL_EXECUTORが採用される

■ ICS以降でパラレル実行するには
AsyncTask#executeOnExecutor(Executor, Object…)メソッドを使用する
ExecutorにAsyncTask.THREAD_POOL_EXECUTORを指定

パラレル実行時のスレッドプール

下記のように設定されている模様。
並列多重度: 5 (CORE_POOL_SIZE)
最大プール数: 128 (MAXIMUM_POOL_SIZE)
キューイング数: 10 (sPoolWorkQueue)
並列処理が5多重を超えるとキューイングされる。
要求のキューイングが出来なかった場合は最大128までプールする。

GridViewを高速スクロールした際などに、プール数が128を超えてしまい、
RejectedExecutionExceptionがthrowされる
Viewの参照を渡す場合はWeakReferenceを使用する

ViewがGCで破棄されるタイミングはActivityが破棄されるタイミングであるべきなので、
AsyncTaskがViewの参照を保持しないよう、WeakReferenceを使用する。