首页 > 编程知识 正文

安卓java基础教程(android基础教程第3版下载)

时间:2023-05-05 08:32:11 阅读:75423 作者:405

Context相信大多数安卓开发者每天都有接触,但这并不意味着编辑很少和大家分享。 今天学习一下你今天不知道的细节吧。 一起和爱站技术频道的编辑一起学习吧。

区别联系:

复制代码就是:

publicclassmyactivityextendsactivity {

公共语音方法

mContext=this; //since活动扩展上下文

mContext=getApplicationContext (;

mContext=getBaseContext (;

}

}

this是活动的实例,扩展了上下文,其生命周期从创建到销毁活动

getApplicationContext ) )返回到APP应用程序的上下文,生命周期是整个APP应用程序,只有在APP应用程序被破坏后才会被破坏

Activity.this的上下文返回到当前的activity上下文,属于activity,如果activity破坏他,则会被破坏

getBaseContext ()返回在构造函数中指定的上下文或setBaseContext () )中设置的上下文。 因为SDK文档很少,所以不推荐

明确生命周期后,在使用中会发生错误。 例如,如果有使用context的全局数据操作类,则必须使用getApplicationContext而不是ACtivity。 这可以确保数据库操作与活动无关。 (

应用场景:

例如activity oncreate :

复制代码就是:

保护性语音创建(绑定状态) {

super.oncreate(state;

textviewlabel=newtextview(this; 将上下文传递给view控制

label.settext(leaksarebad );

setcontentview (标签;

}

将activity context传递给view意味着view具有对activity的引用,并且引用了activity占用的资源: view hierachy、resource等。

当context以这种方式发生内存泄漏时,会发生很多内存泄漏。 这里泄露的意思是gc未能回收活动的内存。

学习和企业活动是一件简单的事情。 屏幕旋转时,系统将销毁当前活动,保存状态信息,并创建新的活动。

例如,我写了一个需要加载大图片的APP应用程序。 我不想在每次旋转屏幕时放弃并重新加载此图像。

实现这一请求的简单想法是定义静态Drawable,以便Activity类创建并销毁它,并始终存储在内存中。

示例实现:

复制代码就是:

publicclassmyactivityextendsactivity {

私密性后台客户端;

保护性语音创建(绑定状态) {

super.oncreate(state;

textviewlabel=newtextview(this;

label.settext(leaksarebad );

if (后台==null ) {

sbackground=get drawable (r.drawable.large _ bitmap );

}

label.setbackgrounddrawable (sbackground; //drawable attached to a view

setcontentview (标签;

}

}

这个步骤看起来很简单,但问题很大。 画面旋转后有leak。 也就是说,gc无法销毁活动。

正如我刚才说的,当屏幕旋转时,系统将放弃当前的活动。 但是,将drawable与view关联后,drawable保存了view的引用,即后台保存了对label的引用,而label保存了对activity的引用。

因为不能销毁drawable,所以不能销毁引用对象,也不能销毁间接引用对象。 因此,系统无法销毁当前活动,并且会发生内存泄漏。 gc对这种类型的内存泄漏无能为力。

为了避免这种内存泄漏,activity中的对象的生命周期必须长于activity,并且从对象到activity的引用不能成功销毁activity。

我们可以使用应用程序上下文。

应用程序上下文伴随应用程序的一生,与活动的生命周期无关。

可以通过Context.getApplicationContext ()或Activity.getApplicationContext ) )获得应用程序上下文。

要避免与上下文相关的内存泄漏,请注意以下事项:

1 .防止生命周期较长的对象引用活动上下文。 也就是说,它确保引用活动的对象与活动自身的生命周期相同

2 .生命周期较长的对象可以使用应用程序上下文

3 .避免非静态内部类,尽量使用静态类,避免生命周期问题,注意内部类引用外部对象导致的生命周期变化

使用爱站技术频道主编介绍的android基础教程内容进行详细说明,相信大家在一定程度上已经理解了。 要了解更多信息,请继续关注爱站技术频道。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。