保持对Locale实例的静态引用是否合适?

时间:2015-05-31 14:01:57

标签: java android reference static locale

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

现在,为了澄清,这是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(仅限语言环境部分):

if (!Utils.isLocaleNull()) {
    String locale = PreferenceManager.getDefaultSharedPreferences(getBaseContext())
            .getString(getResources().getString(R.string.prefsKeyLanguage), "default");
    if (locale != null && !locale.equals("default"))
        Utils.setLocale(new Locale(locale));
}

以下是我在所有活动中加载语言环境的方法:

Utils.loadLocale(getBaseContext());

最后,在loadLocale中我们有if (locale == null) return;并且在语言环境加载器中我们有if (... && !locale.equals("default")),这意味着如果选择System Default,则语言环境将为null,这意味着如果系统不会更改语言环境选择默认值。

一切都很完美!我的意思是,它按预期工作。但在某些情况下它会失败吗?这是个好主意吗?我知道在某些情况下保持对实例的静态引用是个坏主意。这是其中一些案例吗?如果是,我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:1)

你是对的,这不是一个好主意,因为Android一旦需要内存就会摆脱那个静态变量(而且它经常发生)。

您应该使用SharedPreferences设置和检索Locale

要处理SharedPreferences中的Object,请使用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);