Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类 似Win32中的Handle句柄,很多方法需要通过 Context才能识别调用者的实例,比如说Toast的第一个参数就是 Context,一般在Activity中我们直接用this代替,代表调用者的 实例为Activity,而到了一个button的 onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要 原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。
Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它 允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收 intents。
两种类型的Context
在android中context可以作很多操作,但是最主要的功能是加载和访问资源。在android中有两种context ,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。比如一个activity的onCreate
protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); //传递context给view control label.setText("Leaks are bad"); setContentView(label); }
把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity占有的资 源:view hierachy, resource等。
内存泄露
这样如果context发生内存泄露的话,就会泄露很多内存。这里泄露的意思是gc没有办法回收activity的内 存。
注释:为什么GC没有办法回收相应的内存,个人感觉是因为传递Context会增加对象指针的引用计数, 所以基于智能指针技术的GC无法释放相应的内存。
当屏幕旋转的时候,系统会销毁当前的activity,保存状态信息,再创建一个新的。比如我们写了一个应 用程序,它需要加载一个很大的图片,我们不希望每次旋转屏幕的时候都销毁这个图片,重新加载。实现这个 要求的简单想法就是定义一个静态的Drawable,这样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); } }
这段程序看起来很简单,但是却问题很大。当屏幕旋转的时候会有leak(即gc没法销毁activity)。我们 刚才说过,屏幕旋转的时候系统会销毁当前的activity。但是当drawable和view关联后,drawable保存了view 的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能销毁 ,它所引用和间接引用的都不能销毁,这样系统就没有办法销毁当前的activity,于是造成了内存泄露。gc对 这种类型的内存泄露是无能为力的。避免这种内存泄露的方法是避免activity中的任何对象的生命周期长过 activity,避免由于对象对 activity的引用导致activity不能正常被销毁。
为了防止内存泄露,我们应该 注意以下几点:
不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期 是一样的
对于生命周期长的对象,可以使用application context
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期 变化
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 内存泄露
, leaks
, activity
, context
, label
, 内存泄露内存android
, 销毁对象
, 一个
, android中的context
, View回收
, android图片旋转
, 避免内存泄露
获取drawable
android中context详解、android中的context、android中context、android context、android getcontext,以便于您获取更多的相关知识。