当包含时区时,SimpleDateFormat 花费的时间太长

2024-01-14

我正在使用这个简单的日期格式

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");

问题是当我使用它时转换时间需要太长时间,在 logcat 中我看到这样的东西

I/Resources( 4284): Loaded time zone names for en in 272ms.
I/Resources( 4284): Loaded time zone names for en in 194ms.
I/Resources( 4284): Loaded time zone names for en in 112ms.
I/Resources( 4284): Loaded time zone names for en in 111ms.
I/Resources( 4284): Loaded time zone names for en in 113ms.
I/Resources( 4284): Loaded time zone names for en in 127ms.
I/Resources( 4284): Loaded time zone names for en in 253ms.
I/Resources( 4284): Loaded time zone names for en in 110ms.
I/Resources( 4284): Loaded time zone names for en in 154ms.
I/Resources( 4284): Loaded time zone names for en in 112ms.

我如何使用简单的日期格式化程序,但为了加快速度,我不想每次转换花费约 150 毫秒......

有人以前遇到过这个问题吗?


这是由于时区字符串的延迟初始化造成的。只有第一个 打电话要花这么长时间。如果之后再次使用 SimpleDateFormat 从缓存加载,不应该再花那么长时间了。

在更改之前,它是在加载类并因此开始时完成的 一项活动需要多花 2-3 秒的时间。这对用户造成了更严重的影响 与第一次实际使用时花费的几秒钟相比,体验会更好。这 问题是,由于设计原因,目前无法规避此问题 SimpleDateFormat API 的。只有更快的手机才能通过更少的时间来解决这个问题 是时候收集这些字符串了。

缓存发生在 SimpleDateFormat 正在使用的 DateFormatSymbols 中。经过 重用该实例可能只需要加载一次(对于 相同的地方)。您还可以在启动时在线程中创建该实例 活动,以便一旦使用它就已经被缓存。要初始化字符串只需调用 .hashCode() 强制初始化缓存。更快一点但不太简单 是序列化实例。这也强制缓存被初始化。

在此期间,请考虑在需要之前使用 AsyncTask 在流程中“预热”SimpleDateFormat。只需解析 AsyncTask doInBackground() 中的某些日期即可使其在不会对用户产生太大影响的某个时间加载时区。一旦在进程中初始化,SimpleDateFormat 将快速运行,直到进程终止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当包含时区时,SimpleDateFormat 花费的时间太长 的相关文章

随机推荐