Edited at

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

More than 3 years have passed since last update.


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