Android Java - Joda Date很慢

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

在Android上使用Joda 1.6.2

以下代码挂起约15秒。

DateTime dt = new DateTime();

最初发布此帖 Android Java - Joda Date在Eclipse / Emulator中很慢 -

只是试了一遍,它仍然没有更好。有没有其他人有这个问题或知道如何解决它?

提问于
用户回答回答于

我强烈怀疑这是因为它必须为默认时区建立ISO年代表,这可能涉及读取所有时区信息。

你可以通过ISOChronology.getInstance()第一次打电话来确认,然后再打一次电话new DateTime()。我怀疑它会很快。

你知道哪些时区将与你的应用程序相关吗?您可能会发现,通过重建Joda Time以缩短时区数据库,您可以更快地完成整个任务。或者,DateTimeZone.setProvider()使用你自己的实现来调用Provider并不会做太多工作。

这是值得检查是否这实际上是在第一个问题,当然:)你可能想尝试明确地传递在UTC时区,这将不需要读取时区数据库...但你永远不知道你什么时候会无意中触发调用,它确实需要的默认时区,此时你会招致同样的成本。

用户回答回答于

我也遇到了这个问题。Jon Skeet的怀疑是正确的,问题在于时区的加载效率非常低,打开一个jar文件,然后阅读清单以尝试获取这些信息。

但是,仅仅调用DateTimeZone.setProvider([custom provider instance ...])是不够的,因为对于我来说没有意义的原因,DateTimeZone在它调用的地方有一个静态初始化器getDefaultProvider()

为了完全安全,您可以在调用joda中的任何内容之前通过设置此系统属性来覆盖此默认设置。

例如,在您的活动中,添加以下内容:

@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;
    }
}

我已经测试过这个版本,它似乎可以在Android SDK 2.1+和joda版本1.6.2上运行。它当然可以进一步优化,但在分析我的应用程序(mogwee)时,这会将 DateTimeZone初始化时间从〜500ms减少到〜18ms

如果您使用proguard来构建应用程序,则必须将此行添加到proguard.cfg,因为Joda希望类名完全按照您的指定:

-keep class com.your.package.FastDateTimeZoneProvider

扫码关注云+社区