目前在Android上的Joda Time表现?

时间:2016-08-09 18:29:11

标签: android jodatime

我听说在过去中关于在Android上使用Joda Time的性能问题。一个具体的例子是加载时区数据的方式的问题,这导致在应用程序的生命周期中不再需要时分配大量内存。但是,我认为其中一些问题也已得到解决。

除了一般的“我不信任”情绪,:)是否有任何当前问题继续使Joda Time成为处理Android日期的糟糕选择?

1 个答案:

答案 0 :(得分:1)

问题仍然存在。问题是图书馆使用ClassLoader.getResourceAsStream。自Android 6.0.1_r11起,此问题尚未修复 - 有关详细信息,请参阅here

撰写本文时,默认ZoneInfoProvider still uses this mechanism - 来自master的当前提示:

private InputStream openResource(String name) throws IOException {
    InputStream in;
    if (iFileDir != null) {
        in = new FileInputStream(new File(iFileDir, name));
    } else {
        final String path = iResourcePath.concat(name);
        in = AccessController.doPrivileged(new PrivilegedAction<InputStream>() {
            public InputStream run() {
                if (iLoader != null) {
                    return iLoader.getResourceAsStream(path);
                } else {
                    return ClassLoader.getSystemResourceAsStream(path);
                }
            }
        });
        if (in == null) {
            StringBuilder buf = new StringBuilder(40)
                .append("Resource not found: \"")
                .append(path)
                .append("\" ClassLoader: ")
                .append(iLoader != null ? iLoader.toString() : "system");
            throw new IOException(buf.toString());
        }
    }
    return in;
}

在一些跳转中,您可以将此问题方法的使用情况追溯回DateTimeZone.getProvider here

public static Provider getProvider() {
    Provider provider = cProvider.get();
    if (provider == null) {
        provider = getDefaultProvider();
        if (!cProvider.compareAndSet(null, provider)) {
            provider = cProvider.get();
        }
    }
    return provider;
}

getDefaultProvider()会创建有问题的ZoneInfoProvider类;因此,如果您使用默认Provider的JodaTime,您仍会遇到相同的性能问题。