Twitterクライアントを作成している時、デバッグ端末の一つであるHTL23を使っている際に発生した謎の処理落ち現象についてのメモを残しておきたいと思います。
どのぐらいの処理落ちだったか
とにかく何をするにも遅い。
例えばEditTextに文字を入力しようとし、キーボードが出てくる際AndroidManifest.xmlに
android:windowSoftInputMode="adjustResize"
などと書いておくと自動で画面のリサイズを行ってくれますが、そのリサイズに2秒は軽く待たされる程度には処理落ちが激しかったです。
解決しようと実行した手段
- ほぼすべてのViewに対して手動で描画更新を行う
しかし描画自体が処理落ちによってスキップされてるため解決には至らず。
- 同期処理を非同期処理に置き換える
今回の問題に対しては全くの効果なし。
- Viewの階層を見直す
これも効果は全くなし。
- AdapterのgetView()を見直す
コードは整理されたけどこれも効果としてはほぼ無いに等しい。関係ないけどgetView()がすぐにスパゲッティと化するのは考えものである。
- Viewを一部非表示にしてみたりする
いくつかViewを非表示にすると処理落ちが無くなり効果があった模様
どのViewが処理落ちの原因だったのか
原因はズバリImageViewでした。
ですがすべてのImageViewがという訳では無く、大きな画像を小さく表示すると処理落ちが起きるようです。
ImageViewは大きな画像でも小さく表示する際リサイズを行ってくれますが、どうやらHTL23はこの動作がかなりの苦手分野のようで、IS11CAなどのかなり初期の端末にも負けるようです。
どうも「大きい画像一つ用意しておけばなんとかなる」と思ってたのがこの処理落ちを発生させてしまったようです。
幸いなことに、画像が大きいのであれば適切なサイズのものを生成してくれるWebサービス(今回使用したのはAndroid Asset Studioというサービス)があったりするので利用してみるのも良いかと思います。
また今回はHTL23で確認されたことですが、他の端末でも起きないとは限らないのでこの際に適切なサイズのアイコンを生成しておくと後で変なトラブルにはならないと思います。
結論
リソース画像は適切なサイズのものを生成しましょう。