Activity context 和 Application context 区别与联系
2016-03-09 14:15
288 查看
context大家应该都不陌生,每个Activity的标配,用来加载资源什么的。但是context有两种:Activity context 和 Application context 。一直以来对这两个context都理解不清,这次专门记录下。
Activity context 和 Application context 的区别在于生命周期。
Application context是个好汉(全局变量),与你的程序同生共死。而Activity context 则是个随处可见的墙头草,你的Activity不在了,它就不在了。
值得注意的是Activity context使用不当是会造成内存泄漏的,这里用网友的一段代码解释。比如,当我们旋转屏幕的时候,Activity是会被销毁重建只保存状态信息,里面的资源也会重新抓取。为了不想重新加载图片资源,我选择一个静态变量保存,简直机智!
public class myactivity extends Activity {
private
static Drawable sBackground;
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);//drawable
attached to a view
setContentView(label);
}
}
但是看似OK的代码其实问题很大。由于sBackground是静态的,因此sBackground不会被销毁。而sBackground保存了label的引用,label保存了myactivity 的引用,这一连串联系决定,myactivity
也不能被销魂,这样就引起了内存泄漏。
2016年3月10日补充:
后来在另一家博客上看到“谦虚的天下”讲到,上面这种bug已经在Android3.0以后被官方搞定了,也就是说我们现在在这样使用,也是OK的,原因请看:
http://blog.csdn.net/qq_27258799/article/details/50843554
总之内存泄漏经常很难让用户察觉到,但可怕的是内存泄漏的堆积,久而久之就会出现大名鼎鼎的OOM(Out
Of Memory),所以我们要尽量在每个地方避免内存泄漏问题。
谨记三点:
不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。
对于生命周期长的对象,可以使用application context 。
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。
Activity context 和 Application context 的区别在于生命周期。
Application context是个好汉(全局变量),与你的程序同生共死。而Activity context 则是个随处可见的墙头草,你的Activity不在了,它就不在了。
值得注意的是Activity context使用不当是会造成内存泄漏的,这里用网友的一段代码解释。比如,当我们旋转屏幕的时候,Activity是会被销毁重建只保存状态信息,里面的资源也会重新抓取。为了不想重新加载图片资源,我选择一个静态变量保存,简直机智!
public class myactivity extends Activity {
private
static Drawable sBackground;
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);//drawable
attached to a view
setContentView(label);
}
}
但是看似OK的代码其实问题很大。由于sBackground是静态的,因此sBackground不会被销毁。而sBackground保存了label的引用,label保存了myactivity 的引用,这一连串联系决定,myactivity
也不能被销魂,这样就引起了内存泄漏。
2016年3月10日补充:
后来在另一家博客上看到“谦虚的天下”讲到,上面这种bug已经在Android3.0以后被官方搞定了,也就是说我们现在在这样使用,也是OK的,原因请看:
http://blog.csdn.net/qq_27258799/article/details/50843554
总之内存泄漏经常很难让用户察觉到,但可怕的是内存泄漏的堆积,久而久之就会出现大名鼎鼎的OOM(Out
Of Memory),所以我们要尽量在每个地方避免内存泄漏问题。
谨记三点:
不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。
对于生命周期长的对象,可以使用application context 。
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。
相关文章推荐
- 【Android】如何使用安卓的logcat『整理』
- Android webview使用详解
- iOS开发有关二维码的介绍
- Android加载Gif和ImageView的通用解决方案:android-gif-drawable:GifTextView(2)
- Android WebView关于图片/文件上传
- 《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-CAPI映射
- 第5章 静态分析Android程序
- iOS中二进制数据转成字典
- Androidstudio生成的Apk文件路径
- 【Android进阶】Android里webview不支持input file的解决方法(上传按钮点击失效的原因)
- 点击多个view 避免同时产生多个响应
- Android 充电信息的获取
- Android 实时获取手机充电状态
- 《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言
- Objective-C之block详细介绍
- 一些android大牛的博客
- iOS GBK编码与汉字相互转换 BABA <---> 汉
- CSDN上下载的一些关于Android程序调用Webservice执行不成功的问题
- 《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件
- iOS新方法systemFontOfSize: weight: