在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的内存。
Leaking an entire activity是很容易的一件事。
当屏幕 旋转的时候,系统 会销毁当前的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不能正常被销毁。我们可以使用application context。application context伴随application的一生,与activity的生命周期无关。application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取 。
避免context相关的内存泄露,记住以下几点:
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
2. 对于生命周期长的对象,可以使用application context
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
分享到:
相关推荐
本章将深入探讨Spring应用上下文的生命周期,从启动准备阶段到关闭阶段,包括各个关键步骤和相关组件的作用。 1. **Spring 应用上下文启动准备阶段** 在这个阶段,AbstractApplicationContext的`prepareRefresh()`...
在Spring MVC和Spring框架的整合应用中,常常会遇到两套上下文的问题。Spring MVC是Spring框架的一个模块,主要用于处理Web请求,而Spring则提供了一个更广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect ...
标题中的“上下文应用”可能指的是在软件开发中,尤其是Java或Spring框架中常见的“上下文(Context)”概念。上下文通常是指程序运行时的状态或环境,它可以包含对象、配置信息以及其他必要的数据,使得不同的组件...
本文旨在深入解析安卓上下文的基本概念及其应用场景,并着重讨论两种类型的上下文——界面上下文(Activity Context)与应用上下文(Application Context)。 #### 二、界面上下文(Activity Context) ##### 1. 概念 ...
双上下文窗口位并行编码技术通过扩展上下文模型,使得编码时可以同时处理多个位,减少了编码时钟周期,提高了编码效率。 为了实现这种高效的编码方法,硬件架构的优化是必要的。在FPGA(Field-Programmable Gate ...
在Android应用开发中,上下文菜单(Context Menu)、选项菜单(OptionsMenu)和子菜单(Submenu)是三种重要的交互方式,用于提供用户与应用界面的多种操作选项。它们各自有不同的应用场景和设计规范,对于提升用户体验至...
而`current_app`的生命周期比请求上下文更长,只要应用实例还在运行,`current_app`就能访问。 **生命周期**: - `current_app`:在整个应用实例运行期间有效。 - `request`和`g`:仅在处理单个HTTP请求时存在,...
"上下文原型框架"是一种专为面向切面编程(AOP)设计的框架,它着重于提供上下文管理和原型实例化的能力。在AOP中,上下文(Context)扮演着核心角色,它负责存储和管理对象,同时也为对象间通信提供了一个容器。此...
在并发编程中,上下文(Context)是非常重要的工具,它能够帮助我们有效地管理任务的生命周期,比如在需要取消一系列goroutine时,或者需要在goroutine之间传递数据时。`Joincontext`是一个非标准库,它提供了将多个`...
这两种机制在MQX中的不同应用,使得MQX操作系统能够在保证实时性的前提下,提升资源利用率,降低上下文切换开销。 文章通过实验对比MQX的上下文切换时间与其它两个主流的实时操作系统(uC/OS-II和FreeRTOS)的时间...
运行上下文是JavaScript执行代码的环境,它决定了变量、函数和对象的可见性和生命周期。主要有以下几种类型: 1. **全局上下文**: 当JavaScript代码在浏览器环境中运行时,全局上下文是最外层的执行环境,全局变量...
### Go语言的上下文管理:context包的精妙应用 #### Go语言简介 Go语言,又称Golang,是由Google开发并开源的一种静态类型的编译语言。它的设计目标是为了提高编程效率,解决现代多核处理器环境下的性能问题。Go...
Spring 应用上下文获取 Bean 是一个非常重要的操作,需要注意 Bean 的生命周期、作用域和依赖关系等方面的知识点。本文总结了 Spring 应用上下文获取 Bean 的常用姿势实例,并对其实现方法和操作注意事项进行了详细...
HttpContext 对象是 Asp.net 应用程序中非常重要的对象,它提供了当前 HTTP 请求的上下文信息。HttpContext 对象具有多个属性,包括 Application、Request、Response、Server、Session 和 User 等。这些属性提供了...
1. **编程语言的上下文管理**:如何理解并处理不同编程语言中变量的作用域、生命周期以及如何在函数调用和并发环境中管理这些上下文。 2. **多线程与并发**:深入理解线程的创建、同步和通信,以及在多核处理器环境...
这些对象分别代表了请求的上下文、请求信息以及响应信息。然后,通过创建HttpApplication类的实例,ASP.NET启动了请求处理管道。如果存在Global.asax文件,ASP.NET会实例化这个文件中定义的类,作为应用程序的全局...
信标调度是实现V2VC高效通信的核心机制,拥塞控制是保障网络稳定运行的关键技术,上下文感知使得调度策略更加智能化和个性化,车载安全通信强调了方案在保障道路安全方面的应用价值,而分布式则体现了方案在实现上的...
“产品知识上下文”强调了在知识共享过程中上下文信息的重要性,上下文提供了知识应用的背景和前提;“自组织”则描述了产品知识组织的动态、自我调节的特点。 研究的分类号为TP311,这表明该研究属于计算机科学...