LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-14

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

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7