android – 当包含时区时,SimpleDateFormat需要太长时间

我正在使用这种简单的日期格式
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将快速运行,直到您的流程终止.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...