2012/01/28

Android:Listのパフォーマンスを向上させる技


ListViewは情報を一覧するのに便利なViewですが、表示する情報量が多くなると
パフォーマンス面で心配が出てきます。

Android標準にはContactsアプリの通話履歴でListViewが使用されています。
通話履歴は最大500件保存でき、表示の際には電話番号と電話帳登録名を紐付け
て最新の情報を表示しています。
(参考ソースはcom.android.contacts.RecentCallsListActivity)(Android3.0以前)

最大件数が500件であることと、全てのデータを電話帳と紐付ける必要がある
ことを考えても、ここがボトルネックになる可能性があることは容易に想像で
きます。

通話履歴では、パフォーマンスを向上させるために様々なテクニックを使用し
ています。
今回はAndroid標準のコードを通じて、パフォーマンス向上のテクニックを
見ていきます。

●データベース
通話履歴のDBには、電話帳と紐付けた結果(電話帳登録名)をname_cacheとして
DBに保持しています。
通話履歴一覧画面では、このname_cacheをListViewに表示します。

このキャッシュは常に最新に保たれているとは限りません。
そのため、通話履歴を立ち上げた直後に表示されるname_cacheの値(電話帳登録名)
は古い情報である可能性があります。
情報が古い場合は更新する必要があります。

●通話履歴DB更新処理
name_cacheを最新にするためには、電話帳DBに最新情報を問い合わせて、
name_cacheと突き合わせ、変更のある場合はname_cacheを更新します。
※ListViewのAdapterは通話履歴DBを参照するCursorAdapterのため、
 更新されたDBの情報が反映されます。

電話帳DBとの紐付け→更新はWorkerThreadパターンが採用されています。
メインスレッドはClientThreadとして動作し、ListAdapterのgetViewで通話履歴DB
の値がChannelに蓄積されリクエストとして処理されます。
電話帳DBへの問い合わせと更新確認はバックグラウンドで動作するWorkerThread
が担当します。
WorkerThreadはClientThreadからのリクエストを確認して、電話帳DBとの
差分がある場合は通話履歴DBを更新します。

以上です。