2012-01-16 22 views
7

Ben bu o zaman dönüştürmek için çok uzun sürüyor kullandığınızda sorunudur bu basit tarih biçiminiSimpleDateFormat Böyle bir şey bakın LogCat içinde, saat dilimi

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

kullanıyorum dahil edildiğinde çok uzun sürüyor

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. 

nasıl hızlandırmak için ama basit tarih formater kullanabilirsiniz, ben ... her dönüşüm için ~ 150ms almak istemiyorum

herkes önce bu sorunu vardı mı

?

+0

kodunuzu gönderin ... –

+0

Eğer yavaşlatan zaman dilimi ise, bunu bir kez hesaplayabilir ve daha sonra Zaman diliminin değişmesi olası olmadığından her biçimleme için dize. – Jave

+0

kod budur, gecikme yeni SimpleDateFormat üzerindedir ("yyyy-MM-dd HH: mm: ss.SSS Z ") ve ben de dahil olmak üzere, yeni SimpleDateFormat (" yyyy-MM-dd HH: mm: ss.SSS ") ile kodumu çalıştırırsanız, [dahil olmak üzere] bölge, sadece iyi çalışıyor , tek sorun, zaman dilimi dahil edildiğinde sadece çok fazla zaman alır neden bilmiyorum – Lukap

cevap

10

Bu, saat dilimi bölge dizelerinin tembel başlatılmasından kaynaklanır. Sadece ilk çağrısı bu kadar uzun sürecek. SimpleDateFormat daha sonra tekrar kullanılırsa, önbellekten yüklenir ve artık o kadar uzun sürmemelidir.

Bu değişiklikten önce, sınıf yüklendiğinde ve böylece 'un başlangıcında yapılan bir etkinlik 2-3 saniyeden daha uzun sürdü. Bu, kullanıcı deneyiminde, ilk kez kullanıldığında bu saniyeleri alırsa çok daha kötü bir etkiye sahipti. sorunu, SimpleDateFormat API'sinin tasarımından dolayı bu sorunu atlatmanın hiçbir yolunun olmamasıdır. Sadece daha hızlı telefonlar, bu dizeleri toplamak için yalnızca daha az alarak daha iyi olabilir.

Önbelleğe alma, SimpleDateFormat'in kullandığı DateFormatSymbols içinde olur. Bu örneği yeniden kullanarak ile sokmaları sadece bir kez yüklemek zorunda kalabilirsiniz ( aynı loale için). etkinliğinin başlangıcında bir iş parçacığında bu Örnek'i de oluşturabilir, böylece kullanıldıktan sonra önbelleğe alınmış olur. Dizeleri başlatmak için yalnızca önbelleği başlatmaya zorlayan .hashCode() öğesini çağırın. Biraz daha hızlı ama daha az basit örneğini serileştirir. Bu ayrıca önbelleğin başlatılmasını zorlar.

Arada, ihtiyacınız olana kadar işleminizde SimpleDateFormat öğesini "ısınmak" için AsyncTask kullanmayı düşünün. AsyncTask doInBackground() 'da bir tarih ayırın, bazen kullanıcıyı çok fazla etkilemeyeceği zaman dilimlerini yüklemek için. İşleminize başladığınızda, SimpleDateFormat işleminiz sonlandırılıncaya kadar hızlı bir şekilde çalışır.

+1

SimpleDateFormat da parçacığı için güvenli değil Android'de? – Somatik

4

Bu, son Android sürümlerinde geçerli değildir (ve eski bir sürüm çalıştırdığınızı söyleyebileceğim günlük mesajının metninden; modern sürümler, icu4c'de yönetilen kodlara ne kadar zaman harcanmış olduğunu söyler) . "Pulkit Goyal" in yanıtının kopyalandığını ve http://code.google.com/p/android/issues/detail?id=3147 numaralı telefondan yapıştırıldığını ve metnin Donut olduğunu belirtiyor. O zamandan beri bu kodu birkaç kez yeniden yazdım. Şu anda, en_US ve sistemin varsayılan yerel ayarı (önyükleme zamanında) zigotta önbelleğe alınır. Başka bir uygulama önbelleği var, böylece diğer bölgeler için yalnızca bir kez ödeme yapmalısınız.

Modern sürümlerdeki en kötü durum, kullanıcının sistemin varsayılan yerel ayarını değiştirdiği yerdir. Yeni varsayılan yerel ayarın paylaşılabildiği zigotta önbelleğe alınan saat dilimi dizelerini almak için zygote'un yeniden başlatılmasını ("çalışma zamanı yeniden başlatma" veya yeniden başlatma) gerektirebilir. (Bu davranışı, hata üzerine yorum 11'de açıkladım ve ICS ile birlikte gönderilmiştir.)

+0

ben HorrorRSS veya ROMA kütüphanelerini kullanarak bir RSS beslemesi yüklemek sonra bu günlük ifadeleri, birkaç kez gerçekleşmesi görüyorum mi. O görünmüyor Her seferinde yeni bir besleme yüklediğimde günlük ifadeleri yazdırılırken her şey önbelleğe alınır, hatta birbiri ardına aynı yöntem çağrısı yapılır.Ben garip olan şu ki SimpleDateFormat kullanmıyorum. merak ediyorum: http://stackoverflow.com/questions/12762 478/android yüklü zamanlı dilimi-isimlerini-için-en-içinde-ms –