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()
で時間が掛かる可能性があることを考慮する必要があります.