ThreadPoolExecutor を使ってサムネイル表示する例
ぜんてい
- 非同期でやりたい
- サムネイル用の画像ファイル自体が無い場合も想定
- ImageView に画像を表示
- ネットワーク通信はしない
ポイント
- ThreadPoolExecutor を使うよ
- LinkedBlockingQueue がベストなのかわからん
- 非同期だから WeakReference 使うよ
ソース
ThreadPoolExecutor を用意するメソッド
/**
* thumbnailManagerExecutor のスコープは private です
*
* @return executor
*/
private ThreadPoolExecutor getThumbnailExecutor() {
if (thumbnailManagerExecutor == null || thumbnailManagerExecutor.isShutdown()) {
thumbnailManagerExecutor = new ThreadPoolExecutor(4, 10, 3600, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
}
return thumbnailManagerExecutor;
}
ThreadPoolExecutor のコンストラクターの引数について
- corePoolSize アイドルであってもプール内に維持されるスレッドの数 => 4
- maximumPoolSize プール内で可能なスレッドの最大数 => 10
- keepAliveTime- スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間 => 3600
- unit keepAliveTime 引数の時間単位
- workQueue タスクが超過するまで保持するために使用するキュー。このキューは、execute メソッドで送信された Runnable タスクだけを保持する
ImageView にサムネイルをセットする
/**
* ImageView にサムネイルをセットする
*
* @param icon
* ImageViewです
* @param FileItem
* ファイル情報が入ったコンテナ
*/
public void setThumbnailIntoView(final ImageView icon, final FileItem item) {
// ★WeakReference を使いましょう
final WeakReference<ImageView> iconHolder = new WeakReference<ImageView>(icon);
final Resources res = icon.getResources();
getThumbnailExecutor().execute(new Runnable() {
public void run() {
// デフォルトのサムネイルか何かを表示させる処理
setThumbnail(iconHolder.get(), getDefaultIconResource(item));
// ファイルのサムネイル(ドキュメントの縮小版画像とか)のキャッシュがあれば取得する処理
Bitmap cachedIcon = getCachedIcon(item);
// キャッシュがあったら、デフォルトのサムネイルから置き換える処理
if (cachedIcon != null) {
setThumbnail(iconHolder.get(), new BitmapDrawable(res, cachedIcon));
}
}
});
}
さんこうしりょう
- box/box-android-sdk-v2 - http://goo.gl/K6a7sP
- Java の BlockingQueue 実装の性能を比較してみた ~ blog.k11i.biz - http://goo.gl/z7Fjgy
- 画像ダウンロードでAsncTaskを立ち上げまくるのはやめましょう - satohu20xx's diary - http://goo.gl/ejtK7N
- Executorsを利用してみる - happytanの足跡 - http://goo.gl/GVrgRK
QiitaでもThreadPoolExecutor関連記事を書いている人がいました
- Java - ExecutorService の復習 - Qiita - http://goo.gl/VBu7fz