Java 保留对区域设置实例的静态引用好吗?
因此,我正在尝试制作一个应用程序,您可以在其中将语言(在首选项活动中)更改为系统默认语言或特定语言。无论何时更改语言,应用程序都会重新启动并选择新的语言环境。当第一个活动启动时,它会将必须使用的区域设置保存到Utils类中的静态变量中。在每个activityoncreate方法中,我都加载该区域设置 现在,为了澄清,这里是Utils类的Locale部分:Java 保留对区域设置实例的静态引用好吗?,java,android,reference,static,locale,Java,Android,Reference,Static,Locale,因此,我正在尝试制作一个应用程序,您可以在其中将语言(在首选项活动中)更改为系统默认语言或特定语言。无论何时更改语言,应用程序都会重新启动并选择新的语言环境。当第一个活动启动时,它会将必须使用的区域设置保存到Utils类中的静态变量中。在每个activityoncreate方法中,我都加载该区域设置 现在,为了澄清,这里是Utils类的Locale部分: private static Locale locale = null; public static boolean isLocaleNull
private static Locale locale = null;
public static boolean isLocaleNull() {
return locale == null;
}
public static void setLocale(Locale locale) {
Utils.locale = locale;
}
public static void loadLocale(Context baseContext) {
if (locale == null) return;
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
baseContext.getResources().updateConfiguration(config, baseContext.getResources().getDisplayMetrics());
}
这是我的第一个活动onCreate(仅限于区域设置部分):
下面是我在所有活动中加载区域设置的方式:
Utils.loadLocale(getBaseContext());
最后,在loadLocale中,我们有if(locale==null)返回代码>在区域设置加载程序中,我们有if(…&&&&!locale.equals(“默认”))
这意味着如果选择了系统默认值,则区域设置将为空,这意味着如果选择了系统默认值,则区域设置不会更改
一切都很完美!我的意思是,它按预期工作。但在某些情况下它会失败吗?这是个好主意吗?我知道在某些情况下,保持对实例的静态引用是个坏主意。这是其中之一吗?如果是,我该怎么办
谢谢 你是对的,这不是一个好主意,因为Android会在需要内存时尽快去掉这个静态变量(这种情况经常发生)
您应该使用SharedReferences设置和检索您的区域设置
要处理SharedReferences中的对象
s,请使用Gson
:
挽救
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(MyObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
检索
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
我不确定线程安全是否重要,如果您必须担心setLocal调用上的争用条件(UI代码上的常见问题),我接受了这个答案,但我找到了一个更好的解决方案-使用setExtra(String)通过intent发送区域设置语言,然后创建区域设置并在另一端使用它。无论如何谢谢你!如果您只需要该语言(String
),为什么不将该语言(作为String
)保存在SharedReferences
中呢?这样,您可以在需要时创建区域设置
,还可以在选项面板中显示当前语言,例如:)I do。在我的第一个活动的onCreate中查看我的代码。问题是,我不想每次都打开并读取首选项文件。别担心。SharedReferences在第一次引用后缓存在内存中,因此它实际上只在第一次打开。好的,谢谢!但是这个缓存有问题。。。例如,如果您读取一些首选项,然后对其进行编辑,则不会将其保存到文件中。因此,如果您在程序关闭前强制停止程序(即取出手机电池),所有首选项都将丢失。。。
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);