在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

07-25 22:56
查看更多