如何防止我的应用程序获取TimeZone.getDefault()的缓存值?

时间:2015-05-08 14:36:50

标签: android calendar timezone

我正在使用TimeZone.getDefault()来设置Calendar类的时区:

Calendar cal = Calendar.getInstance(TimeZone.getDefault());
Log.i("TEST", cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE));

然而,当用户从设置更改其设备的时区时,我的应用程序表示使用前一个时区的时间,直到他们强制停止(从应用程序信息设置)应用程序并重新启动它。

如何阻止getDefault()的缓存?

1 个答案:

答案 0 :(得分:4)

它不漂亮,但您可以调用setDefault(null)来明确擦除缓存的值。根据{{​​3}},这只会影响当前流程(即您的应用)。

取消缓存后的值,下次调用getDefault()时,会重新构建值:

/**
 * Returns the user's preferred time zone. This may have been overridden for
 * this process with {@link #setDefault}.
 *
 * <p>Since the user's time zone changes dynamically, avoid caching this
 * value. Instead, use this method to look it up for each use.
 */
public static synchronized TimeZone getDefault() {
    if (defaultTimeZone == null) {
        TimezoneGetter tzGetter = TimezoneGetter.getInstance();
        String zoneName = (tzGetter != null) ? tzGetter.getId() : null;
        if (zoneName != null) {
            zoneName = zoneName.trim();
        }
        if (zoneName == null || zoneName.isEmpty()) {
            try {
                // On the host, we can find the configured timezone here.
                zoneName = IoUtils.readFileAsString("/etc/timezone");
            } catch (IOException ex) {
                // "vogar --mode device" can end up here.
                // TODO: give libcore access to Android system properties and read "persist.sys.timezone".
                zoneName = "GMT";
            }
        }
        defaultTimeZone = TimeZone.getTimeZone(zoneName);
    }
    return (TimeZone) defaultTimeZone.clone();
}

您可能应该将此与the documentation的广播侦听器结合使用,并且只有在收到此类广播时才会将默认值取消。

编辑:想想看,一个更简洁的解决方案是从广播中提取新设定的时区。来自广播文档:

  

time-zone - 标识新时区的java.util.TimeZone.getID()值。

然后,您只需使用此标识符即可更新缓存的默认值:

String tzId = ...
TimeZone.setDefault(TimeZone.getTimeZone(tzId));

getDefault()的任何后续调用都将返回正确/更新的时区。