我有活动A,它通过意图启动活动B.活动A没有对活动B的引用,在我正在使用的应用程序单例中也没有对活动B的引用。
当我创建活动B时,会创建数千个对象。没关系,这是一个包含大量图片的ListView活动。
但是,当我按下后退按钮并返回活动A时,只释放了几十个对象中的十几个。也为活动调用onDestroy()。我正在使用DDMS查看堆信息,并且多次按“原因GC”强制它释放内存。
我已经对其他应用程序(也使用列表视图)进行了相同的测试,按下后退按钮然后“导致GC”,100%的对象被破坏,所以它肯定不是错误。
有什么建议吗? :-)我已经阅读了android文档中有关泄漏上下文的内容,但这没有用,因为我没有引用其他地方被破坏的活动(或其中的任何内容)。此外,我有许多其他活动以相同的方式工作,并且不会在销毁时释放所有内存。我一定错过了一些明显的东西吗?
编辑:我刚刚意识到我正在使用AsyncTasks,它引用了活动(或者作为arg传递到doInBackground()或者可以通过outerClass.this访问。它们是否可以在线程池中闲置,即使在onPostExecute()之后?
编辑:即使我在运行任何asynctasks之前返回它也会泄漏:-(
编辑:在运行asynctasks之前没有泄漏如果我删除了admob代码,但仍然在使用asynctasks的活动中泄漏..所以asynctask仍然是一个很好的候选人: - )
答案 0 :(得分:2)
我认为ListView
实施中存在一个错误。看一下这个问题:Android: AlertDialog causes a memory leak。
这是一个错误报告:http://code.google.com/p/android/issues/detail?id=12334。它被拒绝但我认为必须重新开放。