Android项目中哪些情况会出现内存泄漏

  介绍

今天就跟大家聊聊有关Android项目中哪些情况会出现内存泄漏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> 1,单例造成的内存泄漏

Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。

public  class  SingleInstance  {      private 才能;static  SingleInstance 实例;   private 才能Context 语境;      private 才能SingleInstance (Context 上下文),{   ,,,this.context =,上下文;   ,,}      public 才能synchronized  static  SingleInstance  getInstance (Context 上下文),{   ,,,if  (instance  !=, null), {   ,,,,,instance =, new  SingleInstance(上下文);   ,,,}   ,,,return 实例;   ,,}   }

这是一个普通的单例模式,大家都知道,静态变量最大的特点是什么,常驻内存,也就是说如果你的应用程序的进程没有没杀死,它就一直在内存中。当创建这个单例的时候,由于需要传入一个上下文中,所以这个上下文的生命周期的长短至关重要:如果传入的是活动的背景:当这个上下文所对应的活动退出时,由于该上下文和活动的生命周期一样长(活动间接继承于上下文),所以当前活动退出时它的内存并不会被回收,因为单例对象持有该活动的引用。

所以正确的单例应该为这种姿势:

public  class  SingleInstance  {      private 才能;static  SingleInstance 实例;   private 才能Context 语境;      private 才能SingleInstance (Context 上下文),{   ,,,this.context =, context.getApplicationContext ();   ,,}      public 才能synchronized  static  SingleInstance  getInstance (Context 上下文),{   ,,,if  (instance  !=, null), {   ,,,,,instance =, new  SingleInstance(上下文);   ,,,}   ,,,return 实例;   ,,}   }

这样不管传入什么上下文最终将使用应用程序的上下文中,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。

<强> 2,非静态内部类(比如内部类,匿名内部类)创建静态实例造成的内存泄漏

有的时候我们可能会在启动频繁的活动中,为了避免重复创建相同的数据资源,会出现这种写法:

public  class  MainActivity  extends  AppCompatActivity  {      private 才能;InnerClass  innerClass;      @Override才能   protected 才能;void  onCreate (Bundle  savedInstanceState), {   ,,,super.onCreate (savedInstanceState);   ,,,setContentView (R.layout.activity_main);      ,,,如果(innerClass ==, null) {   ,,,,,innerClass =, new  InnerClass ();   ,,,}   ,,}      class  InnerClass{才能      ,,}   }

这样就在活动内部创建了一个非静态内部类的单例,每次启动活动时都会使用该单例的数据,这样虽然避免了资源的重复创建,不过这种写法却会造成内存泄漏,因为非静态内部类默认会持有外部类的引用,而又使用了该非静态内部类创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该活动的引用,导致活动的内存资源不能正常回收。

正确的做法为:将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用,请使用ApplicationContext。

<强> 3,处理程序造成的内存泄漏

处理程序的使用造成的内存泄漏问题应该说最为常见了,平时在处理网络任务或者封装一些请求回调等api都应该会借助处理程序来处理,对于处理器的使用代码编写一不规范即有可能造成内存泄漏,如下示例:

public  class  MainActivity  extends  AppCompatActivity  {      private 才能Handler  mHandler =, new 处理程序(),{   ,,@Override   ,,,public  void  handleMessage (Message 味精),{   ,,,,,//?      ,,,}   ,,};      @Override才能      protected 才能;void  onCreate (Bundle  savedInstanceState), {   ,,,super.onCreate (savedInstanceState);   ,,,setContentView (R.layout.activity_main);      ,,,loadData ();      ,,}      private 才能;void  loadData () {   ,,,//肭?   ,,,Message  Message =, Message.obtain ();   ,,,mHandler.sendMessage(消息);   ,,}   }

Android项目中哪些情况会出现内存泄漏