今天就跟大家聊聊有关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项目中哪些情况会出现内存泄漏