ユーザ用ツール

サイト用ツール


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される

      boolean isPooled = false;
      do {
          try {
              new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object);
              isPooled = true;
          } catch (RejectedExecutionException ree) {
              LogUtils.e("", "RejectedExecutionException");
              try {
                  Thread.sleep(500);
              } catch (InterruptedException ie) {
                  ie.printStackTrace();
              }
          }
      } while ( ! isPooled );
asynctaskメモ.1442401451.txt.gz · 最終更新: 2015/09/16 20:04 by sou