我正在构建一个类来处理应用共享首选项。我想让它从项目的所有部分单独访问。我不能使用常规的 getInstance 方法,因为我需要传递上下文以使类起作用。我想在 MainActivity.java 中传递一个上下文,而不是一直在那里。会不会有内存泄漏?
这是我目前的解决方案:
public class LocalStorage {
private Context context;
private static LocalStorage instance = null;
protected LocalStorage() {
// Exists only to defeat instantiation.
}
public static LocalStorage getInstance() {
if(instance == null) {
instance = new LocalStorage();
}
return instance;
}
public static LocalStorage getInstance(Context _context) {
LocalStorage localStorage = getInstance();
localStorage.context = _context.getApplicationContext();
return localStorage;
}
private SharedPreferences sharedPreferences() {
return context.getSharedPreferences("mySettings", Context.MODE_PRIVATE);
}
....
最佳答案
您不会造成泄漏,因为您只是通过调用 getApplicationContext()
保留对应用程序上下文的引用。
如果您直接引用 _context
并且该引用恰好是 Activity
或其他一些 Context
那么是的,您会造成内存泄漏.
作为旁注,这里的单例实现有点奇怪。我建议以下通过将 Context
传递给构造函数来删除不必要的额外 getInstance()
:
public class LocalStorage {
private static LocalStorage instance = null;
private Context context;
private LocalStorage(Context context) {
this.context = context;
}
public synchronized static LocalStorage getInstance(Context context) {
if(instance == null) {
instance = new LocalStorage(context.getApplicationContext());
}
return instance;
}
private SharedPreferences sharedPreferences() {
return context.getSharedPreferences("mySettings", Context.MODE_PRIVATE);
}
....
关于java - 上下文作为变量的单例 - 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36817412/