在Android上使用Joda 1.6.2
下面的代码挂起大约15秒钟。
DateTime dt = new DateTime();
最初发布此帖子
Android Java - Joda Date is slow in Eclipse/Emulator -
只是再次尝试,它仍然没有任何更好的。还有其他人有这个问题或知道如何解决吗?
最佳答案
我也遇到了这个问题。乔恩·斯凯特(Jon Skeet)的猜想是正确的,问题在于时区的加载效率非常低,打开了一个jar文件,然后读取了 list 以尝试获取此信息。
但是,仅调用DateTimeZone.setProvider([custom provider instance ...])
是不够的,因为出于我认为不合理的原因,DateTimeZone有一个静态初始化程序,在其中调用getDefaultProvider()
。
为了完全安全,您可以通过在设置joda中的任何内容之前设置此系统属性来覆盖此默认值。
例如,在您的 Activity 中,添加以下内容:
@Override
public void onCreate(Bundle savedInstanceState) {
System.setProperty("org.joda.time.DateTimeZone.Provider",
"com.your.package.FastDateTimeZoneProvider");
}
然后,您要做的就是定义
FastDateTimeZoneProvider
。我写了以下内容:package com.your.package;
public class FastDateTimeZoneProvider implements Provider {
public static final Set<String> AVAILABLE_IDS = new HashSet<String>();
static {
AVAILABLE_IDS.addAll(Arrays.asList(TimeZone.getAvailableIDs()));
}
public DateTimeZone getZone(String id) {
if (id == null) {
return DateTimeZone.UTC;
}
TimeZone tz = TimeZone.getTimeZone(id);
if (tz == null) {
return DateTimeZone.UTC;
}
int rawOffset = tz.getRawOffset();
//sub-optimal. could be improved to only create a new Date every few minutes
if (tz.inDaylightTime(new Date())) {
rawOffset += tz.getDSTSavings();
}
return DateTimeZone.forOffsetMillis(rawOffset);
}
public Set getAvailableIDs() {
return AVAILABLE_IDS;
}
}
我已经对此进行了测试,它似乎可以在具有joda版本1.6.2的Android SDK 2.1+上运行。当然可以对其进行进一步优化,但是在分析我的应用程序(mogwee)时,DateTimeZone的初始化时间从〜500ms减少到了〜18ms。
如果您使用proguard来构建应用程序,则必须将此行添加到proguard.cfg中,因为Joda希望类名与您指定的完全相同:
-keep class com.your.package.FastDateTimeZoneProvider