Android - 内存泄漏,我做错了什么?

4
我有一个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代码,则在运行异步任务之前不会泄漏,但在使用异步任务的活动中仍然会泄漏..所以异步任务仍然是一个好的候选对象 :-)

1
你调用了 System.gc(); 吗? - Mak
1
没有完整的代码,只能猜测。您确定没有持久化AsyncTasks及其对活动的引用,或者其他引用到活动的对象吗?比如,在您的Application类中。 - ernazm
刚刚将asynctask类设为静态,并在onPostExecute中将所有对activity的引用设置为空,但问题仍未解决。 - Ted
1个回答

2

我很有希望,但是'lv.setOnItemClickListener(null)'没有改变任何东西。 - Ted
你是否只使用了ListView的唯一监听器?你尝试过使用MAT来确定泄漏的根源吗? - Michael
是的,我也删除了所有的点击监听器。我会尝试消除更多的代码,然后再尝试使用MAT。谢谢。 - Ted
谢谢你的最后一条评论,太感谢了。我把findViewById的结果视图设置为适配器返回的视图的标签(我把它看作是性能提示)。泄漏问题解决了! :-) - Ted
谢谢!顺便问一下,您知道ListView的getView()方法中的视图回收器是否跨多个活动/列表视图进行回收?如果是这样,对于我所有的列表视图,让getChildType()返回一致的类型是否有益? - Ted
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接