Android Java - Joda Date 很慢

标签 android jodatime

在 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

关于Android Java - Joda Date 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059663/

相关文章:

android - Honeycomb ActionBar 中 SearchView 上的 KeyListener 不起作用

android - 在android中更改标签栏的标题

java-8 - DateTimeFormatter 工作日似乎差了一个

java - 如何指定 Joda-Time 中应解析日期的世纪

android - 声音没有在 Create 上播放

java - 无法在android studio中获取json

android - 按住按钮时限速功能

java - 将 ZoneDateTime 字符串解析为 Joda 日期时间

android - JodaTime 无法识别某些 Android 时区

java - JodaTime 第一次调用时非常慢