首先说下写这篇博客前的经历,在最近项目中遇到一个非常常见(蛋疼)的问题——OOM,大家都知道OOM的问题主要是加载的图片过多时还有就是引用context没有释放造成的。通过MAT监测,各种分析还是没有看出什么头绪,试着把项目中有可能引用Context的地方都修改了一边,悲剧的是问题依旧在。之所以没有怀疑是图片过多引起的,是因为用的Android-Universal-Image-Loader ,一个比较稳定的加载图片的开源项目。后来根据MAT分析问题一直和UIL有关联,实在没办法死马当活马医,换成了xUtils快速开发框架,最初源于Afinal框架。替换完之后,怀着忐忑的心情测试,十分钟、半小时、OOM没有出现(窃喜),以为问题到此完美解决,继续操作蛋疼的OOM又回来,简直阴魂不散啊。愤怒,气愤,受打击。先不管它了
几天后,心情平静,仔细想想还是要把它解决掉,谁叫咱是完美主义者呢。继续google、百度发现Android Memory Management,MAT的用法介绍的比较详细。最终发现罪魁祸首还是Context没有释放,导致垃圾无法回收引起的。
下面进入本帖主题,android程序退出的方法很多,不过不在本帖讨论范围之内。我采取的方法是把每个打开的activity放进Stack集合,activity关闭时从Stack集合移除。这也是OOM的根源所在,只是把activity加入到Stack中,而没有移除,就导致了Stack保持了Context引用,虽然activity关闭但是资源没有释放,导致没办法回收。具体解决办法见代码,在onCreate方法中添加的栈中,在onDestroy方法中移除
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appManager = AppManager.getAppManager();
// 把当前activity加入栈中
appManager.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// activity关闭,从栈中移除
appManager.finishActivity(this);
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
这就是主要代码,顺便奉上demo一份以供参考
具体下载目录在 /2014年资料/2月/21日/Android怎样才能完全退出程序