5个android开发中比较常见的内存泄漏问题及解决办法

5个android开发中比较常见的内存泄漏问题及解决办法

ID:35522903

大小:60.71 KB

页数:11页

时间:2019-03-25

5个android开发中比较常见的内存泄漏问题及解决办法_第1页
5个android开发中比较常见的内存泄漏问题及解决办法_第2页
5个android开发中比较常见的内存泄漏问题及解决办法_第3页
5个android开发中比较常见的内存泄漏问题及解决办法_第4页
5个android开发中比较常见的内存泄漏问题及解决办法_第5页
资源描述:

《5个android开发中比较常见的内存泄漏问题及解决办法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、5个Android开发中比较常见的内存泄漏问题及解决办法在Android开发屮,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏乂有什么影响呢?在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被冋收,这就导致本该被冋收的对象不能被回收而停留在堆内存屮,内存泄漏就产生了。内存泄漏有什么影响呢?它是造成应用程序00M的主要原因之—o由于Android系统为每个应用程

2、序分配的内存有限,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crasho了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的Android程序开发中,尽量避免它。下面小编搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。一、单例造成的内存泄漏Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏O因为单例的静态特性使得单例的生命周

3、期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。如下这个典例:publicclassAppManager{privatestaticAppManagerinstance;privateContextcontext;privateAppManager(Contextcontext){this.context=context;}publicstaticAppManagergetlnstance(Cont

4、extcontext){if(instance!=null){instance=newAppManager(context);}returninstanee;}}这是一个普通的单例模式,当创建这个单例的时候,由于需要传入一个Context,所以这个Context的生命周期的长短至关重要:1>传入的是Application的Context:这将没有任何问题,因为单例的牛命周期和Application的一样长;2>传入的是Activity的Context:当这个Context所对应的Activity

5、退出时,由于该Context和Activity的生命周期一样长(Activity间接继承于Context),所以当前Activity退出吋它的内存并不会被凹收,因为单例对象持有该Activity的引用。所以正确的单例应该修改为下面这种方式:publicclassAppManager{privatestaticAppManagerinstance;privateContextcontext;privateAppManager(Contextcontext){this.context=context

6、.getApplicationContext();}publicstaticAppManagergetlnstance(Contextcontext){if(instance!=null){instance=newAppManager(context);}returninstanee;}}这样不管传入什么Context最终将使用Application的Context,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。二、非静态内部类创建静态实例造成的内存泄漏有的时候我们可能会在启动频繁的Ac

7、tivity中,为了避免重复创建相同的数据资源,会出现这种写法:publicclassMainActivityextendsAppCompatActivity{privatestaticTestResourcemResource=null;(©OverrideprotectedvoidonCreate(BundlesavedlnstanceState){super.onCreate(savedlnstanceState);setContentView(R.layout.activity_main

8、);if(mManager==null){mManager=newTestResource();}//...}classTestResource{//...}}这样就在Activity内部创建了一个非静态内部类的单例,每次启动Activity时都会使用该单例的数据,这样虽然避免了资源的重复创建,不过这种写法却会造成内存泄漏,因为非静态内部类默认会持有外部类的引用,而又使用了该非静态内部类创建了…个静态的实例,该实例的生命周期和应用的-样长,这就导致了该静态实例-直会持有该Activity的引用,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。