Android 避免内存泄漏(译)

本文探讨了Android应用程序中的内存管理问题,特别是在G1手机上仅有16MB的可用内存限制下。文章详细介绍了如何避免因长时间持有Context对象导致的内存泄露,并提供了有效减少内存使用的建议。
Android应用程序的内存被限定在16MB,至少在G1手机上是这样。对于一个手机来说,这已经占用了非常多的内存了,但是对于开发者想要实现的目标而言,这些内存是非常少的。即时你本来就没打算用掉所有的内存,但是你应该尽可能的少用内存,来让其他程序可以保持运行,而不是被系统杀掉。系统在内存里保存的应用程序越多,用户在应用程序之间选择切换的速度就会越快。作为我工作的一部分,我跟踪了Android应用程序内存泄露的情况,发现它们大多数是因为同一个问题:保持了对Context对象的长期的引用。

在Android系统上,很多操作都用到了Context对象,但是大多数都是用来加载和访问资源的。这就是为什么所有的显示控件都需要一个Context对象作为构造方法的参数。在Android应用程序中,你通常可以使用两种Context对象,Activity和Application。当类或者方法需要Context对象的时候,开发者通常会用第一个作为参数。
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);

TextView label = new TextView(this);
label.setText("Leaks are bad");

setContentView(label);
}
这就意味着,View对象对整个activity保持引用,因此,也就保持对activity内的所有东西的引用;通常是整个View结构和它所有的资源。所以,如果你一直保持着对Activity的引用,你占用了很多内存。在你不注意的时候,你很容易就持有对activity的长期引用。
当屏幕方向改变时,默认的,系统会摧毁当前的activity,然后创建一个新的activity,这个新的activity会显示刚才的状态。在这样做的过程中,Android系统会重新加载UI用到的资源。现在假设你的应用程序中有一个比较大的bitmap类型的图片,然而你不想每次旋转时都重新加载它。
保持屏幕旋转,又不让它重新加载,最简单的方法是用静态变量的方法。
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);
}
这样的代码执行起来是快速的,但是是错误的;这样写会一直保持着对activity的引用。当一个Drawable对象附属于一个View时,这个View就相当于drawable对象的一个回调(引用)。在上面的代码片段中,就意味着drawable和TextView存在着引用的关系,而TextView自己引用着activity(Context对象),这个activity又引用着相当多的东西。
这个例子就是非常简单的泄露Context对象的一种情况,你可以在“ Home screen's source code( unbindDrawables()方法)”中看到是如何做的,当activity被摧毁时,设置drawable的回调(引用)为null。令人感兴趣的是,有很多种情况,你会创建出一个泄露context对象的链,它们是糟糕的。它们会很快耗光内存,使你的内存溢出。

有两种简单的方法可以避免由引用context对象造成的内存泄露。最明显的一个方法是,避免context对象超出它的作用范围。上面的例子显展示了静态引用的情况,但是在类的内部,隐式的引用外部的类同样的危险。第二种方法是,使用Application对象。这个context对象会随着应用程序的存在而存在,而不依赖于activity的生命周期。如果你打算对context对象保持一个长期的引用,请记住这个application对象。通过调用Context.getApplicationContext() 或者 Activity.getApplication().方法,你可以很容易的得到这个对象。

总之,要避免由于引用context对象造成的内存泄露,记住以下几点:

不要保持对activity的持久引用(对activity的引用应该和activity本身有相同的生命周期)
尽量使用application代替activity
如果不能控制非静态的内部类的生命周期,尽量在activity中避免有非静态的内部类,在activity中使用静态的类,要对activity保持弱引用。
垃圾回收器并不能保证阻止内存泄露
潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值