java - 上下文作为变量的单例 - 内存泄漏?

标签 java android

我正在构建一个类来处理应用共享首选项。我想让它从项目的所有部分单独访问。我不能使用常规的 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/

相关文章:

java - "java.lang.IllegalStateException: The driver executable does not exist"报告奇数附加路径

java - 兔子MQ : Improve queue flushing speed

android - 传感器肖像 : How to catch orientation changing?

Android - 测试谷歌地图信息窗口点击

java - 卡夫卡流媒体 : Issue with user defined 'Serdes'

java - 当我在 Spinner 上选择项目时出现 NullPointerException

java - 调用 rx.Observable.sample() 时如何接收最后一个序列发射?

Android Pie (9.0) WebView 多进程

php - 如何设置CMS作为Android应用程序的后端?

java - Android Studio AlarmManager.cancel() 关闭应用程序