- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 TimeZone.getDefault()
设置 Calendar
类的时区:
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
Log.i("TEST", cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE));
但是,当用户从“设置”更改他们设备的时区时,我的应用程序会显示使用前一个时区的时间,直到他们强制停止(从应用程序信息设置)应用程序并重新启动它。
如何阻止 getDefault()
的缓存?
最佳答案
它并不漂亮,但您可以调用 setDefault(null)
来显式删除缓存值。根据 the documentation ,这只会影响当前进程(即您的应用)。
清空缓存值后,下次调用 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();
}
您可能应该将其与 ACTION_TIMEZONE_CHANGED
的广播监听器结合使用如果您收到这样的广播,则只清空默认值。
编辑:仔细想想,一个更简洁的解决方案是从广播中提取新设置的时区。来自广播文档:
time-zone - The java.util.TimeZone.getID() value identifying the new time zone.
然后您可以简单地使用此标识符来更新缓存的默认值:
String tzId = ...
TimeZone.setDefault(TimeZone.getTimeZone(tzId));
随后对 getDefault()
的任何调用都将返回正确/更新的时区。
关于android - 如何防止我的应用程序获取 TimeZone.getDefault() 的缓存值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30126454/
我正在使用 this stackOverflow post 中的代码,这符合我的预期: Enumeration keys = UIManager.getDefaults().keys();
我经常使用 TimeZone.getDefault 调用,我收到了来自客户的关于运行缓慢的报告。使用 jstack 检查线程堆栈跟踪,我看到许多线程被此方法阻塞: "LoadBalancerClien
package com.soft.mash.contactmanager; import android.app.Activity; import android.os.Bundle; import
当我运行以下行时, System.out.println(java.util.TimeZone.getDefault()); 我得到了以下输出。 sun.util.calendar.Zon
这个硬编码的 GMT+2 很有魅力。 calendarCurrent.setTimeZone(TimeZone.getTimeZone("GTM+2")); 当然我不需要硬编码,所以我正在使用 cal
My server is in US and I am accessing the application in India through web browser, in that case wha
目前我的系统区域设置是en-UK,它曾经是en-US(我已经重新启动了我的电脑以使这个更改生效) 当我打印 Locale.getDefault().getCountry().toString() 时,
最近开始学习 kotlin 编程语言的 android 系统编程。在编写用于从应用程序本身发送 SMS 的简单应用程序时,我遇到了 SmsManager.getDefault() 现在已弃用的问题,因
我有以下代码: import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import
我有一个非常简单的代码: public static void main(String[] arg){ FileSystems.getDefault(); } 在Java7中运行良好 但抛出
我正在使用 eclipse 的作业 API 将大任务作为作业运行,一旦任务完成,我将 boolean 变量设置为 true,如果该变量为 true,我将在 UI 线程中执行 WizardDialog。
我正在使用 TimeZone.getDefault() 设置 Calendar 类的时区: Calendar cal = Calendar.getInstance(TimeZone.getDefaul
unix 机器上的服务器总是使用 en 作为默认语言环境。以下是语言环境输出 LANG=en_US LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_CO
本文整理了Java中xdi2.core.io.XDIReaderRegistry.getDefault()方法的一些代码示例,展示了XDIReaderRegistry.getDefault()的具体用
本文整理了Java中xdi2.core.io.XDIWriterRegistry.getDefault()方法的一些代码示例,展示了XDIWriterRegistry.getDefault()的具体用
即使将所有 SWT 代码包装在“Display.getDefault().asyncExec”中,我也无法更新我的 UI。 假设我有一个监听器,称为单击一个按钮。 Listener enterlisn
我的应用程序中有一个广播接收器,它会在设备的区域设置更改时被调用。我的应用程序在一些设备上存在错误,特别是 Nexus 5x 和 Galaxy S8+(很可能还有其他设备),其中 Locale.get
如果查找返回 null 该怎么办?我正在使用 org.openide.util.Lookup 的 Lookup.getDefault().lookup() ,它用于查找对象的实例。一般模式是传递一个
我在导入我的项目时在 eclipse 中遇到上述错误。我已经在 java 构建路径中添加了 jsse jar。错误代码为 var = SSLContext.getDefault().getSocket
我们有一个案例,其中运行使用 1.8.0_092 的 Java 8 应用程序的 PC 从 Locale.getDefault() 返回 null。虽然处理这个很简单,但我更担心返回 null,因为 d
我是一名优秀的程序员,十分优秀!