J'ai aussi rencontré ce problème. Jon Skeet les soupçons étaient corrects, le problème est que les fuseaux horaires sont chargés vraiment inefficace, l'ouverture d'un fichier jar, puis la lecture du manifeste pour essayer d'obtenir cette information.
Toutefois, simplement en appelant DateTimeZone.setProvider([custom provider instance ...])
n'est pas suffisante, car, pour des raisons qui ne font pas de sens pour moi, DateTimeZone a un initialiseur statique où elle appelle getDefaultProvider()
.
Pour être complètement sûr, vous pouvez remplacer cette valeur par défaut en définissant cette propriété du système avant de vous jamais demandé quoi que ce soit dans le joda.
Dans votre activité, par exemple, ajouter ceci:
@Override
public void onCreate(Bundle savedInstanceState) {
System.setProperty("org.joda.time.DateTimeZone.Provider",
"com.your.package.FastDateTimeZoneProvider");
}
Ensuite, tout ce que vous avez à faire est de définir FastDateTimeZoneProvider
. J'ai écrit ce qui suit:
package com.your.package;
public class FastDateTimeZoneProvider implements Provider {
public static final Set<String> AVAILABLE_IDS = new HashSet<String>();
static {
AVAILABLE_IDS.addAll(Arrays.asList(TimeZone.getAvailableIDs()));
}
public DateTimeZone getZone(String id) {
if (id == null) {
return DateTimeZone.UTC;
}
TimeZone tz = TimeZone.getTimeZone(id);
if (tz == null) {
return DateTimeZone.UTC;
}
int rawOffset = tz.getRawOffset();
//sub-optimal. could be improved to only create a new Date every few minutes
if (tz.inDaylightTime(new Date())) {
rawOffset += tz.getDSTSavings();
}
return DateTimeZone.forOffsetMillis(rawOffset);
}
public Set getAvailableIDs() {
return AVAILABLE_IDS;
}
}
J'ai testé cela et il semble fonctionner sur Android SDK 2.1+ avec joda de la version 1.6.2. Il peut bien sûr être optimisé, mais tout de profilage de mon application (mogwee), cette diminution de la DateTimeZone initialiser le temps de ~500ms à ~18ms.
Si vous utilisez proguard construire votre application, vous devez ajouter cette ligne à proguard.cfg car Joda attend le nom de la classe à être exactement comme vous le précisez:
-keep class com.your.package.FastDateTimeZoneProvider