避免长期持有了一个Context的引用造成内存泄露
来源:互联网 发布:诚意致知格物顺序 编辑:程序博客网 时间:2024/05/21 14:57
Android上 ,Context可以用于很多操作,但是大部分时候是用来加载以及使用资源。这就是为什么所有的widgets在他们的构造函数中接受一个Context参数。在一般的android应用中,你通常有两种Context:分别是Activity和Application。通常的,当我们的类和方法需要使用到context时,我们传递的是Activity这个context。
- @Override
- protected void onCreate(Bundle state) {
- super.onCreate(state);
- TextView label = new TextView(this);
- label.setText("Leaks are bad");
- setContentView(label);
- }
- private static Drawable sBackground;
- @Override
- protected void onCreate(Bundle state) {
- super.onCreate(state);
- TextView label = new TextView(this);
- label.setText("Leaks are bad");
- if (sBackground == null) {
- sBackground = getDrawable(R.drawable.large_bitmap);
- }
- label.setBackgroundDrawable(sBackground);
- setContentView(label);
- }
这个例子展示了一个最简单的Context 泄漏的情况,你可以在Home screen 的源码中看到我们是如何解决这个问题的( 查找unbindDrawables() 方法) ,这就是当activity 被销毁的时候将drawables 的回调设为null 。有趣的是,你可能创造出一系列context泄漏的情况有很多,这非常糟糕。他们会是你很快内存溢出。
有两种简单的方法来避免context 相关的内存泄漏。最显著地一个是避免context 逃出他自己的范围之外。上面的例子就展示了使用静态引用的情况,而内部类和他们对外部类的的隐式引用也是同样危险的。第二种方法是使用Application context 。这个context 的生存周期和你的应用的生存周期一样长,而不是取决于activity 的生存周期。如果你想保持一个长期生存的对象,并且这个对象需要一个context ,记得使用application 对象。你可以通过调用Context.getApplicationContext() or Activity.getApplication() 来获得。
总而言之,想要避免context 相关的内存泄漏 ,记住以下几点:
1、不要对activity 的context 长期引用( 一个activity 的引用的生存周期应该和activity 的生命周期相同)
2、试着使用关于application的 context 来替代和activity相关的context
3、如果一个acitivity 的非静态内部类的生命周期不受控制,那么避免使用它;使用一个静态的内部类并且对 其中的activity 使用一个弱引用。解决这个问题的方法是使用一个静态的内部类,并且对它的外部类有一 WeakReference,就像在ViewRoot中内部类W所做的就是这么个例子。
4、垃圾回收器不能处理内存泄漏的保障
- 避免长期持有了一个Context的引用造成内存泄露
- 避免引用Context造成的内存泄露
- 非静态的内部类会持有外部类的一个隐式引用 造成内存泄露
- 避免context内存泄露
- 避免Drawable保持引用的内存泄露
- Android应用程序避免Context相关的内存泄露的方法
- Android如何避免由Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 避免Android中Context引起的内存泄露
- 【干货】避免Android中Context引起的内存泄露
- android开发避免Context引起的内存泄露问题
- 避免Android中Context引起的内存泄露
- Xcode查看真机app沙盒内容
- c# 字节流与图片互转
- mac 下安装 CASPERJS
- JS清除IE浏览器缓存的方法
- 无刷新分页 jquery.pagination.js
- 避免长期持有了一个Context的引用造成内存泄露
- 丑代码展示
- Android studio使用Gradle导入第三方开发包的方法
- Android 学习网站或者App
- springmvc+mybatis+lucene4文档搜索系统(支持分页)
- 不规则的form表单的提交
- 用原生JavaScript写出类似jQuery中slideUp和slideDown效果
- 杭电1003(Max Sum) 首次dp
- ../configure: /bin/sh^M: bad interpreter: No such file or directory