美文网首页
单例模式引起的内存泄漏

单例模式引起的内存泄漏

作者: s大司令 | 来源:发表于2018-01-30 14:03 被阅读0次

1、单例模式引起的内存泄漏

由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当的话,很容易造成内存泄漏。比如下面一个典型的例子。

public class AppManager {

    private static AppManager instance;

    private Context context;

    private AppManager(Context context) {

          this.context = context;

    }

    public static AppManager getInstance(Context context) {

          if (instance != null) {

                instance = new AppManager(context);

          }

          return instance;

    }

}

这是一个普通的单例模式,当创建这个单例的时候,由于需要传入一个Context,所以这个Context的生命周期的长短至关重要:

1、如果此时传入的是 Application 的 Context,因为 Application 的生命周期就是整个应用的生命周期,所以这将没有任何问题。

2、如果此时传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会被回收,这就造成泄漏了。

正确的方式应该改为下面这种方式:

public class AppManager {

    private static AppManager instance;

    private Context context;

    private AppManager(Context context) {

         // 使用Application 的context 

          this.context = context.getApplicationContext();

  }

    public static AppManager getInstance(Context context) {

          if (instance != null) {

                instance = new AppManager(context);

          }

          return instance;

    }

}

或者这样写,连 Context 都不用传进来了:

在你的 Application 中添加一个静态方法,getContext() 返回 Application 的 context,

...

context = getApplicationContext();

...

//获取全局的context - - >return返回全局context对象

public static Context getContext(){

    return context;

}

public classAppManager{   

    private static AppManager instance;

    private Context context;

    private AppManager() {

         // 使用Application 的context

          this.context = MyApplication.getContext();

}

    public static AppManager getInstance() {

          if (instance != null) {

                instance = new AppManager();

          }

          return instance;

    }

}

相关文章

  • Android 容易引起内存泄漏的小知识

    android单例模式引起的内存泄漏 当我们在使用单例模式保存缓存时,一般会把当前页面的上下文Context传入单...

  • 单例模式引起的内存泄漏

    1、单例模式引起的内存泄漏 由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当的话,很容易...

  • Android 常见内存泄漏

    一、单例造成的内存泄漏Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏。因为单例的...

  • Android内存优化——常见内存泄露及优化方案

    内存泄漏情况分类 1、单例模式导致内存泄漏 2、静态变量导致内存泄漏 3、非静态内部类导致的内存泄漏 4、未取消注...

  • Android内存泄漏

    单例模式对象造成的内存泄漏因为单例模式对象的静态特性使得单例的生命周期和应用的生命周期一样长,有时创建单例模式对象...

  • 内存泄漏的场景,Handler机制

    内存泄露场景 单例造成的内存泄漏:单例模式的生命周期和应用一样长。单例中包含了一个其他对象的引用(比如contex...

  • 常见的内存泄漏(转载)

    一、静态变量持有 二、单例模式造成 三、非静态内部类创建静态实例可能造成的内存泄漏 四、webview造成内存泄漏...

  • 内存泄露

    什么是内存泄漏? 引用导致的对象未被释放 引起内存泄漏的因素: 单例 非静态内部类持有外部类的隐式引用,而在外部类...

  • Android内存优化之内存泄漏

    内存泄漏 内存泄漏一般有以下几种情况:单例、静态变量、Handler、匿名内部类、资源使用未关闭 单例导致的内存泄...

  • 何止学习Andoid内存泄漏优化

    一、Android内存泄露及优化 1、单例模式造成内存泄漏 单例的静态特性使得它的生命周期同应用的生命周期一样长,...

网友评论

      本文标题:单例模式引起的内存泄漏

      本文链接:https://www.haomeiwen.com/subject/gqoqzxtx.html