我听说在过去中关于在Android上使用Joda Time的性能问题。一个具体的例子是加载时区数据的方式的问题,这导致在应用程序的生命周期中不再需要时分配大量内存。但是,我认为其中一些问题也已得到解决。
除了一般的“我不信任”情绪,:)是否有任何当前问题继续使Joda Time成为处理Android日期的糟糕选择?
答案 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,您仍会遇到相同的性能问题。