• スポンサードリンク

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

Android 非同期

MediaStoreから非同期でサムネイルを読み込むAdapterを作ったよ。
とりあえず特徴ね。

  1. 読込みの殆どを非同期で処理(^o^)v
  2. LruCache(support library版)を使ってサムネイル再取得を高速化
  3. AsyncTaskやAsyncTaskLoader等に頼らず1ファイル完結(いいことばかりじゃないけどね)
  4. bucketIdによるグループ分けに対応(特定のフォルダだけを表示できます)
  5. サムネイル画像だけじゃなくって実イメージや属性取得用のメソッドも追加(これは非同期じゃないけど、非同期でアクセスするためのヘルパーメソッドが有ります)
  6. ImageViewにサムネイルを表示するだけじゃなくってTextViewにタイトルまで表示できるように設定可能

ネットでよく見かけるコードだと、BaseAdapterを直接継承してたり、UIスレッドで読み込んでたり、生成時にidを配列に全部読み込んでたり!!(写真が何百枚もあったらどうするんでしょう?)、Activity/Fragment側に追加の処理を書かないといけなかったりして、使用方法が、「アダプターを生成+ListView/GridViewにセット、以上.」みたいな感じで使えるのはなさそうなのと、たまたま自分で必要になったので、作ってしまいました。

1.継承元はCursorAdapter

MediaStoreについてAndroid Developersで見てみると、

The Media provider contains meta data for all available media on both internal and external storage devices.

と書いてあります。

(MediaStoreは、)内部/外部ストレージの両方に存在する使用可能なメディアのメタデータを保持したproviderです・・・よくわかりませんね(-_-;)
もっと意訳すると、MediaStoreは端末に存在する画像や動画,音楽等のデータについて、種類やオリジナルデータの保存先など(これがメタデータです)へアクセスするためのヘルパークラスってことですね。実際のメタデータとやらはContentProvider/ContentResolver経由でアクセス可能です。つまり取得できるのはメタデータを含んだテーブル/レコードを指すCursorクラスのインスタンスなのです(MediaStoreクラスは、生のCursorだけではなく、サムネイルをビットマップとして取得したりするためのヘルパークラス・ヘルパーメソッドも含んでいます)。

にも関わらず、ネットをウロウロすると、BaseAdapterから継承しているサンプルが多い気がします。CursorをラッピングするためのAdapterなので、BaseAdapterではなくCursorAdapter(またはその子クラス)しかありえへんと自分は思うんですが、どうなんでしょう?

CursorAdapterはBaseAdapterから継承していて、Cursorに含まれるデータにアクセするために必要な処理を実装してくれています。SimpleCursorAdapterだと#bindViewが汎用的すぎて今回の用途には少し効率悪いので今回はパス。
CursorAdapterとSimpleCursorAdapterの中間のResourceCursorAdapterでもいいのですが、ほぼCursorAdapterと一緒なので、今回の継承元はCursorAdapterに決定です。

« »

  • スポンサードリンク