JodaTimeをAndroidで使うときの注意点


JodaTimeとは

JavaのCalendarクラスは死ぬほど扱いが面倒くさいわけですが,それを直感的に扱えるようにしてくれたラッパーライブラリです.

使い方はこの辺の記事にお任せします
http://qiita.com/bukowski1920/items/81de2408099ce38a8721
http://www.mwsoft.jp/programming/java/joda_time_sample.html

初回の new DateTime() がスゴく遅い

スゴく便利なJodaTimeですが,初回の new DateTime() で日付周りを扱うためのリソースを読み込むため,めちゃくちゃ遅いです.
そのため,UIスレッドで new DateTime() する前に,アプリ起動時にバックグラウンドで new DateTime() してリソースをロードしておく等の工夫をする必要があります.

実際に計測してみると

long start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime1: " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime2: " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime3: " + (System.currentTimeMillis() - start));
DateTime1: 993
DateTime2: 0
DateTime3: 0

と,約1秒もの時間が掛かっていることが分かります.
(RK3066 1.6GHzx2(?) 1GB RAMの実機で確認)

うかつにUIスレッドでぶち当たるとANRに繋がったりUXを著しく低下させることに繋がるため,注意が必要です.

その他

コードを詳しく追っているわけでは無いので,何か回避策があるのかもしれません.
(デフォルトロケールを指定すればそのリソースだけを読み込むから早くなる等)

アプリケーションやActivityのライフサイクルで,どのタイミングで読み込んだリソースが破棄されるのかも把握していません.
おそらくプロセスが死ぬまでは生きていると思いますが,プロセスが死んだ後の復元処理などでも new DateTime() で時間が掛かる可能性があることを考慮する必要があります.