2012-01-16 55 views
7

我使用這個簡單的日期格式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毫秒,每轉換...

有誰有過這個問題嗎?

+0

發佈您的代碼... – 2012-01-16 14:09:40

+0

如果是時區減慢,您可以計算一次,然後將其添加爲字符串到每個格式,因爲時區不太可能改變。 – Jave 2012-01-16 14:11:26

+0

這是代碼,延遲在新的SimpleDateFormat(「yyyy-MM-dd HH:mm:ss。SSS Z「);這是因爲我有區域包括在內,如果我用新的SimpleDateFormat(」yyyy-MM-dd HH:mm:ss.SSS「)運行我的代碼; [在時區之外]它工作得很好,唯一的問題是當時區被包含時,它只需要很多時間,我不知道爲什麼 – Lukap 2012-01-16 14:12:58

回答

10

這是由於時區區字符串的延遲初始化。只有第一個 通話需要這麼長時間。如果SimpleDateFormat之後再次使用,它將從緩存中加載 ,並且不應該再花那麼長時間。

在此之前,改變的也加載的類,當它被完成,因而 開始活動了那些2-3秒。這對用戶體驗的影響要比它在第一次實際使用時需要那些秒的情況要糟得多。 的問題是,由於SimpleDateFormat api的設計 ,現在沒有辦法繞過這個問題。只有更快的電話才能解決這個問題,只需花費較少的時間收集這些字符串。

緩存發生在SimpleDateFormat的是使用的DateFormatSymbols。通過 重新使用該實例,可能只需要加載一次(針對 相同的loale)。您也可以在 活動啓動時在線程中創建該實例,以便在使用它之後已將其緩存。初始化字符串只需調用 .hashCode(),它強制初始化緩存。有點快但不那麼簡單, 是序列化實例。這也強制高速緩存被初始化。

在此期間,可以考慮使用的AsyncTask「熱身」的SimpleDateFormat在你的過程中,你需要它。只需解析AsyncTask doInBackground()中的某個日期,以便在不會對用戶造成太大影響的情況下加載時區。一旦在您的過程中初始化,SimpleDateFormat將快速運行,直到您的過程終止。

+1

SimpleDateFormat在Android上也不是線程安全的嗎? – Somatik 2012-08-18 15:14:33

4

這是不正確最近的Android版本(從日誌消息的文本,我可以告訴你正在運行一個老版本;現代版本告訴你有多少時間在ICU4C花在與託管代碼) 。請注意,來自「Pulkit Goyal」的答案是從http://code.google.com/p/android/issues/detail?id=3147複製並粘貼的,正文是指甜甜圈。自那以後,我重寫了這段代碼幾次。目前,en_US和系統的默認語言環境(在引導時)被緩存在zygote中。還有一個每個應用程序緩存,所以對於其他語言環境,您只需支付一次。

最壞的情況在現代的版本是用戶改變系統的默認語言環境。它需要重新啓動zygote(「運行時重新啓動」或重新啓動)以獲取新的默認語言環境的時區字符串緩存在zygote中,以便它們可以共享。 (我在這個錯誤的評論11中描述了這種行爲,並且它隨ICS一起提供)。

+0

我看到這些日誌語句發生多次,使用HorrorRSS或ROME庫加載RSS源後沒有出現任何東西都會被緩存,因爲每次我加載一個新的feed時都會打印日誌語句,即使在相同的方法調用中也是如此,奇怪的是我沒有使用SimpleDateFormat。 '好奇:http://stackoverflow.com/questions/12762 478/Android的加載時間區,名稱換EN-在毫秒 – 2012-10-06 18:18:16