パフォーマンスチューニング【TextView編】

といってもシチュエーションは限定的であんまり同じ状況に遭遇することは多くないと思うが、setCompoundDrawables()やsetCompoundDrawablesWithIntrinsicBounds()を連続して呼び出している場合に注意。

上記メソッドはソースコードを見ればわかるが、内部でinvalidate()とrequestLayout()を呼び出していて、ループの中で呼び出したりするとinvalidate()によるonDraw()などの描画処理が毎回呼び出されてしまうのでこれがボトルネックになる。

私の場合、50個のTextViewに毎回Drawableをセットしていたら50個回すのに200msほどかかっていました…(Galaxy Nexusの場合)。

また、setText()も意外と重い処理なのでループの中で毎回setText(null)などをすることはなるべく避ける。

これらは私の開発中のアプリにパフォーマンス課題があって調べたら発覚したものだが、パフォーマンスチューニングの鉄則はむやみに当たりをつけて改善しないできちんとボトルネックを特定すること。

android(アプリケーション、フレームワーク)の場合、それはとても楽で、Debug.startMethodTracing()でtracelogをとってTraceViewで表示すれば視覚的に重いメソッドを特定できる。

TraceViewに関しては下記などが参考になります。
http://labs.techfirm.co.jp/android/iguchi/2262

ちなみに上記の対応策は、すでに同じ値がセットされていたら再びメソッドを呼び出さないチェックをsetCompoundDrawablesWithIntrinsicBounds()とsetText()を呼び出す前に入れただけ。getText()やgetCompoundDrawables()はとても早いことはソースコードをチェック済みだったので。
それだけでも200ms→20msになりました。