• スポンサードリンク

MediaStoreから非同期でサムネイルを読み込むAdapterを作ったよ-3

Android 非同期

ちょっと予定外だけど、以前の記事MediaStoreから非同期でサムネイルを読み込むAdapterを作ったよの追加記事です。
手持ちの機種の一部・・・android2.xxの一部・・・でうまくイメージを読み込めない時があるので少し修正してみた。変更したのは、主に2箇所。ひとつは、非同期でMediaStore.imagesからサムネイルを読み込んで表示するLoaderDrawable#startLoadメソッドで、もうひとつは実際の読込みを行うためのThumbnailLoaderクラス。

LoaderDrawable#startLoadメソッド

LoaderDrawable#startLoadメソッドは、サムネイルの非同期読込みを開始するためのメソッド。元々は、非同期読込みのためのThumbnailLoaderが生成されていない時だけ生成するようにしていて、再利用するようにしていた。でもどうもうまく動かない時があるみたいなので、ThumbnailLoaderを毎回生成するように変更。原因はよくわからなくて気持ち悪いけど、Android標準のGalleryアプリでもここで読み込み用のオブジェクトを再利用するとうまく動かないみたい。
あと、#startLoadの最初に同じidなら読込みをしないようにしていたのも削除。これを入れてるとかえってちらついたり表示が遅くなったりする時があるみたい。キャッシュに有れば読み込まないってだけの方が体感的には速かった。

ソースはこちら。

ThumbnailLoaderクラス

LoaderDrawable#startLoadメソッドでThumbnailLoaderインスタンスを再利用しないようにしたこともあって、より確実にcancelできるようにFutureTask<T>を使うように変更。

ソースはこちら。

再利用しないようにしたので、31〜34行と42行目のidのチェックは要らないような気もするけど。とりあえず残したままにしてます。

GitHubの方も更新したので、もし使っている人がいたら更新してね。
ソースと簡単なデモはこちら:GitHub

ちなみに、MediaStorePhotoAdapterはCursorAdapterを継承しているので、GridView/ListView/Gallery等のAdapterViewを継承しているクラスで使えます。
でも、GalleryはAPI16以降で非推奨な上に、Galleryの代わりに使えって言うHorizontalScrollViewやViewPagerではMediaStorePhotoAdapterは使えません。HorizontalScrollViewはともかく、ViewPagerはPagerAdapterを継承したAdapterでないとだめなんだよねぇ。もしかしたら近いうちにPagerAdapterを継承したのも追加するかも。名前はMediaStorePhotoPagerAdapterかなぁ?

« »

  • スポンサードリンク

%d人のブロガーが「いいね」をつけました。