包含时区时,SimpleDateFormat需要太长时间

Luk*_*kap 7 timezone datetime android delay simpledateformat

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

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用它时,转换时间需要很长时间,在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.
Run Code Online (Sandbox Code Playgroud)

我如何使用简单的日期格式化器,但为了加快速度,我不想每次转换需要~150ms ...

以前有人有这个问题吗?

Pul*_*yal 10

这是由于时区区域字符串的延迟初始化.只有第一次通话需要这么长时间.如果之后再次使用SimpleDateFormat,它将从缓存中加载,并且不再需要那么长时间.

在更改之前,它已在类加载时完成,因此活动的开始时间延长了2-3秒.这对用户体验的影响远远大于第一次实际使用时的秒数.问题是由于SimpleDateFormat api的设计,现在没有办法绕过这个问题.只有更快的手机可以通过花更少的时间来收集这些字符串来解决这个问题

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

在此期间,请考虑使用AsyncTask在您需要之前在您的流程中"预热"SimpleDateFormat.只需在AsyncTask doInBackground()中解析一些日期,以便在不会对用户造成太大影响的情况下加载时区.在您的流程中初始化后,SimpleDateFormat将快速运行,直到您的流程终止.