この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
asynctaskメモ [2015/09/16 20:01] sou [スレッドプールオーバー対策] |
asynctaskメモ [2015/12/11 13:43] (現在) sou [パラレル実行時のスレッドプール] |
||
---|---|---|---|
ライン 18: | ライン 18: | ||
===== パラレル実行時のスレッドプール ===== | ===== パラレル実行時のスレッドプール ===== | ||
+ | 下記のように設定されている模様。\\ | ||
並列多重度: 5 (CORE_POOL_SIZE)\\ | 並列多重度: 5 (CORE_POOL_SIZE)\\ | ||
最大プール数: 128 (MAXIMUM_POOL_SIZE)\\ | 最大プール数: 128 (MAXIMUM_POOL_SIZE)\\ | ||
ライン 26: | ライン 26: | ||
要求のキューイングが出来なかった場合は最大128までプールする。\\ | 要求のキューイングが出来なかった場合は最大128までプールする。\\ | ||
\\ | \\ | ||
- | ===== スレッドプールオーバー対策 ===== | ||
GridViewを高速スクロールした際などに、プール数が128を超えてしまい、\\ | GridViewを高速スクロールした際などに、プール数が128を超えてしまい、\\ | ||
RejectedExecutionExceptionがthrowされる\\ | RejectedExecutionExceptionがthrowされる\\ | ||
- | boolean isPooled = false; | + | ===== Viewの参照を渡す場合はWeakReferenceを使用する ===== |
- | do { | + | ViewがGCで破棄されるタイミングはActivityが破棄されるタイミングであるべきなので、\\ |
- | try { | + | AsyncTaskがViewの参照を保持しないよう、WeakReferenceを使用する。 |
- | new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object); | + | |
- | isFinish = true; | + | |
- | } catch (RejectedExecutionException ree) { | + | |
- | LogUtils.e("", "RejectedExecutionException"); | + | |
- | try { | + | |
- | Thread.sleep(500); | + | |
- | } catch (InterruptedException ie) { | + | |
- | ie.printStackTrace(); | + | |
- | } | + | |
- | } | + | |
- | } while ( ! isPooled ); | + | |