android中的静态单例类内存泄漏

时间:2014-11-12 08:42:11

标签: java android memory-leaks

我有一个扩展我的User对象的静态单例类:

public class TestSingleton extends User{

    private static TestSingleton singletonInstance;

    private TestSingleton() {
    }

    public static TestSingleton getObj() {
        if (singletonInstance == null) {
            singletonInstance = new TestSingleton();
        }
        return singletonInstance;
    }
}

单例的目的是避免在我想在不同的活动中使用我的User对象时创建新实例:

TestSingleton test = new TestSingleton();
test.doSomthing();

并在一行中编写它并在我的应用程序生命周期中只创建一次实例:

TestSingleton.getObj().doSomthing();

我的问题是:

使用静态Singleton是否会造成内存泄漏并保持对我使用单例的任何活动的引用?

使用安全吗?还是有更好的解决方案?

4 个答案:

答案 0 :(得分:1)

  

这种静态Singleton的使用是否会造成内存泄漏并保持引用   对于我使用单身人士的任何活动?

它在99.9%的案例中不胜一筹,

Is it safe to use?

这取决于您的安全意味着什么。例如,您的实现不是线程安全的。如果从两个不同的线程调用getObj(),则可能会发生两次实例化TestSingleton。

 or there is a better solution?

使用Enum的Singleton模式的实现。您可以在Effective Java上找到一个示例

答案 1 :(得分:0)

如果只需要User的一个实例,则无需扩展它。您在TestSingleton中所做的只是在User课程中完成。

例如:

public class User{

private static User singletonInstance;

private User() {
}

public static User getObj() {
    if (singletonInstance == null) {
        singletonInstance = new User();
    }
    return singletonInstance;
}
}

<强>更新

用于线程安全使用

public synchronized static User getObj() {
    if (singletonInstance == null) {
        singletonInstance = new User();
    }
    return singletonInstance;
}

我认为在这种方法中你不需要考虑内存泄漏。

答案 2 :(得分:0)

A memory leak may happen when an object is stored in memory but cannot be accessed by the running code

对于单身人士,只创建了一个对象。并且它仅在首次使用时创建。没有内存泄漏。 只有当您想要使用多线程时,才必须同步instance(),以便只创建一次对象。

并且99.99%确定不会有任何内存泄漏

答案 3 :(得分:0)

是的,单身人士可能会导致内存泄漏,请阅读以下文章:https://stackoverflow.com/a/13891253/1028256

在Android生命周期中,可能会重新创建活动,并且您的单例可能会保留对旧活动实例的引用,从而防止它被垃圾回收。这意味着如果你保留这样的引用,你应该在单例中使它们在Activity.onDestroy()上取消它们

仅供参考,当应用程序被销毁时,单身人士也可能被销毁,因此您无法依赖它。

可能您需要考虑将数据持久保存在应用程序存储中或Application对象中。