Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保留对区域设置实例的静态引用好吗?_Java_Android_Reference_Static_Locale - Fatal编程技术网

Java 保留对区域设置实例的静态引用好吗?

Java 保留对区域设置实例的静态引用好吗?,java,android,reference,static,locale,Java,Android,Reference,Static,Locale,因此,我正在尝试制作一个应用程序,您可以在其中将语言(在首选项活动中)更改为系统默认语言或特定语言。无论何时更改语言,应用程序都会重新启动并选择新的语言环境。当第一个活动启动时,它会将必须使用的区域设置保存到Utils类中的静态变量中。在每个activityoncreate方法中,我都加载该区域设置 现在,为了澄清,这里是Utils类的Locale部分: private static Locale locale = null; public static boolean isLocaleNull

因此,我正在尝试制作一个应用程序,您可以在其中将语言(在首选项活动中)更改为系统默认语言或特定语言。无论何时更改语言,应用程序都会重新启动并选择新的语言环境。当第一个活动启动时,它会将必须使用的区域设置保存到Utils类中的静态变量中。在每个activityoncreate方法中,我都加载该区域设置

现在,为了澄清,这里是Utils类的Locale部分:

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);