共享首选项的单身人士的Android应用上下文
我想重构我的项目,它有很多不必要的代码与硬编码字符串。所以我想创建单例SharedPrefsManager,我将使用Application上下文。它是否会在我的管理器类中发生静态SharedPrefs的内存泄漏原因。共享首选项的单身人士的Android应用上下文
public class SharedPrefsManager {
private static SharedPrefsManager sharePref = new SharedPrefsManager();
private static SharedPreferences sharedPreferences;
private SharedPrefsManager() {}
public static SharedPrefsManager getInstance(Context context) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE);
}
return sharePref;
}
}
不,它不会得到任何内存泄漏如果您使用应用程序上下文。创建SharedPrefsManager
作为单例,并从Application
类中初始化。这样就可以从任意位置访问
创建这样的,
public class SharedPrefsManager {
private static SharedPrefsManager mInstance= null;
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor prefsEditor;
private SharedPrefsManager(Context context) {
sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE);
prefsEditor = sharedPreferences.edit();
}
public static void init(Context context) {
mInstance = new SharedPrefsManager(context);
}
public static SharedPrefsManager getInstance() {
if (mInstance == null) {
throw new RuntimeException(
"Must run init(Application application) before an instance can be obtained");
}
return mInstance;
}
/**
* To get the Stored string value in Preference.
*
* @param key
* @param defaultvalue
* @return stored string value.
*/
public String getStringValue(final String key, final String defaultvalue) {
return sharedPreferences.getString(key, defaultvalue);
}
/**
* To store the string value in prefernce.
*
* @param key
* @param value
*/
public void setStringValue(final String key, final String value) {
prefsEditor.putString(key, value);
prefsEditor.commit();
}
}
从应用类可以初始化这个样子,
public class StackApp extends Application {
@Override
public void onCreate() {
super.onCreate();
SharedPrefsManager.init(this);
}
}
所以,你可以从任何其他类使用没有上下文。 例如:你可以使用这样的,
SharedPrefsManager.getInstance().setStringValue("key", "value");
我可否知道downvote的原因..? –
我没有downvote,但答案是不好的,因为你不使用getInstance这是一个单身的点:D – Vucko
我只是初始化类,我从来没有使用过,当你使用,你应该调用** SharedPrefsManager。 getInstance()。setstring(“key”,“value”); **这就是我给出的例子的主要目的 –
在静态字段保持SharedPreferences
不会引发内存泄露,因为首不包含Context
本身
为什么你如果事情需要的类的实例你之后是静态的。使'SharedPreferences'非静态。 – Vucko
只要应用程序处于活动状态并且不依赖于活动生命周期,应用程序上下文就会存活,因此在此情况下无内存泄漏 –