没有合适的资源?快使用搜索试试~ 我知道了~
5个Android开发中比较常见的内存泄漏问题及解决办法
4 下载量 91 浏览量
2021-01-04
18:32:48
上传
评论 1
收藏 76KB PDF 举报
温馨提示
android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了。 内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统分配的内存容量,就会出现内存溢出了导致应用Crash. 了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的Android程序开发中,尽量避免它。下面搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。 一、单例造成的内存泄漏 android的单列大家都喜欢使用。但单例模式的静态特征使得他的生命周期和应用的生命周期一样长,这就说明了一
资源推荐
资源详情
资源评论
5个个Android开发中比较常见的内存泄漏问题及解决办法开发中比较常见的内存泄漏问题及解决办法
android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存
泄漏就出现了。
内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统分配的内存容量,就会出现内存溢出了导致应用
Crash.
了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的Android程序开发中,尽量避免它。下
面搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。
一、一、单例造成的内存泄漏单例造成的内存泄漏
android的单列大家都喜欢使用。但单例模式的静态特征使得他的生命周期和应用的生命周期一样长,这就说明了一个对象不
需要使用了,单例对象还持有某个对象,那么这个对象就不能释放了,这就内存泄漏了。
典例:
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的生命周期一样长的生命周期一样长
(Activity间接继承于间接继承于Context),所以当前,所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。的引用。
所以正确的单例应该修改为下面这种方式:
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
this.context = context.getApplicationContext();
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
}
这样不管传入什么Context最终将使用Application的Context,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。
二、非静态内部类创建静态实例造成的内存泄漏二、非静态内部类创建静态实例造成的内存泄漏
有的时候我们可能会在启动频繁的Activity中,为了避免重复创建相同的数据资源,会出现这种写法:
public class MainActivity extends AppCompatActivity {
private static TestResource mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(mManager == null){
mManager = new TestResource();
}
//...
}
class TestResource {
资源评论
weixin_38723461
- 粉丝: 3
- 资源: 964
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功