2012/04/05

Android:アプリ起動の高速化 ViewTreeObserver

ユーザへのレスポンスタイムを早めるためのTips。

onCreateやonResumeでの重い処理はレスポンスを悪くします。
重い処理をバックグラウンドスレッドで行うのも手ですが、バックグランド処理の開始を
遅らせることで更にレスポンスを早くすることが可能です。

レスポンスを早くするには素早くUIを構築することです。
ここでのUIは"現在UIを構築中"であることを伝えるものかもしれませんし、
スタブライクなUIかもしれません。

UIを素早く構築するには、UI構築処理に集中しこれを邪魔しないことです。
バックグラウンドでデータベースアクセスをしたり、ネットワークリソースにアクセスす
ることもUIの構築完了まで我慢します。

簡単なサンプルコードを載せます。
private boolean mFirstDraw = true;

@Override
protected void onResume() {
    super.onResume();

    findViewById(R.id.hoge).getViewTreeObserver().addOnPreDrawListener(
        new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                if (mFirstDraw) {
                    mHandler.sendEmptyMessageDelayed(WHAT, 1000);
                    mFirstDraw = false;
                }
                return true;
            }
        }
    );
}
上記のコードではViewの計測と整列を終え、描画の直前状態をフックして初回描画時の
タイミングから1000msec後にバックグラウンドスレッド処理を開始します。

こうすることで、Viewの描画が完了しUIの提供を終えた頃にバックグラウンド処理が開始
されるのでアプリケーションはUI構築に集中できます。

以上です。