我有一个Activity A,通过Intent启动Activity B。Activity A没有对Activity B的引用,我使用的应用程序单例中也没有对Activity B的引用。
当我创建Activity B时,会创建几千个对象。这是可以接受的,因为它是一个具有很多图像的拥挤ListView的活动。
但是,当我按返回按钮返回到Activity A时,只有几千个对象中的大约十几个被释放。onDestroy()也被调用了。我正在使用DDMS查看堆信息,并多次按'Cause GC'来强制释放内存。
我在其他使用List Views的应用程序上进行了相同的测试,按下返回按钮然后按'Cause GC',它们所有的对象都被销毁了,所以这肯定不是一个错误。
请问有什么建议吗? :-) 我已经阅读了Android文档中关于泄漏上下文的材料,但这并没有帮助,因为我没有在其他地方引用正在被销毁的活动(或其中的任何内容)。此外,我有许多其他的活动都是以同样的方式工作,但在销毁时并没有释放所有内存。我一定是漏掉了一些显而易见的东西?
编辑:我刚才意识到我正在使用具有对Activity的引用(要么作为传递给doInBackground()的参数,要么通过outerClass.this访问)。它们是否会在执行完onPostExecute()后继续留在线程池中?
编辑:即使我在运行任何异步任务之前返回,它也会泄漏 :-(
编辑:如果我删除Admob代码,则在运行异步任务之前不会泄漏,但在使用异步任务的活动中仍然会泄漏..所以异步任务仍然是一个好的候选对象 :-)
当我创建Activity B时,会创建几千个对象。这是可以接受的,因为它是一个具有很多图像的拥挤ListView的活动。
但是,当我按返回按钮返回到Activity A时,只有几千个对象中的大约十几个被释放。onDestroy()也被调用了。我正在使用DDMS查看堆信息,并多次按'Cause GC'来强制释放内存。
我在其他使用List Views的应用程序上进行了相同的测试,按下返回按钮然后按'Cause GC',它们所有的对象都被销毁了,所以这肯定不是一个错误。
请问有什么建议吗? :-) 我已经阅读了Android文档中关于泄漏上下文的材料,但这并没有帮助,因为我没有在其他地方引用正在被销毁的活动(或其中的任何内容)。此外,我有许多其他的活动都是以同样的方式工作,但在销毁时并没有释放所有内存。我一定是漏掉了一些显而易见的东西?
编辑:我刚才意识到我正在使用具有对Activity的引用(要么作为传递给doInBackground()的参数,要么通过outerClass.this访问)。它们是否会在执行完onPostExecute()后继续留在线程池中?
编辑:即使我在运行任何异步任务之前返回,它也会泄漏 :-(
编辑:如果我删除Admob代码,则在运行异步任务之前不会泄漏,但在使用异步任务的活动中仍然会泄漏..所以异步任务仍然是一个好的候选对象 :-)
AsyncTasks
及其对活动的引用,或者其他引用到活动的对象吗?比如,在您的Application
类中。 - ernazm