如果未从已销毁的活动中删除,侦听器是否会创建内存泄漏?

时间:2011-03-08 21:05:32

标签: java android memory-leaks android-activity

如果向控件/视图添加侦听器而不删除它,是否会创建内存泄漏?例如,onCreate会向侦听修改的EditText添加侦听器。你需要在onDestroy中删除这个监听器吗?

我想如果你使用一个匿名监听器或一个实现监听器的局部变量,当Activity由于作用域规则而被销毁时,内存将被释放。

我能看到内存泄漏的唯一方法是监听器是否在intent对象中传递。想法?

2 个答案:

答案 0 :(得分:8)

听众自己不会造成内存泄漏。但是,它们经常使用不当,因此可能导致泄漏。有时您会看到对象引用组件的代码(例如,用于在那里显示消息),其中有一个侦听器,它可以(可能间接地)引用第一个对象。这形成了一个循环,其所有成员共同生活和死亡。当Component是一个短命的对话框时,你可能会遇到问题。初学者倾向于使用像

这样的对象
class MyKitchenSink implements Runnable, KeyListener, ....

可能有很多引用,并且更容易构建内存泄漏 * 。不创建“普遍类”是要走的路。


* 这与C中没有“真正的”内存泄漏一样,因为所有对象都可以访问,并且可以在需要时使用。它只是让对象可以在比预期更长的时间内到达,这就像泄漏一样让你感到内存。

答案 1 :(得分:2)

除非控件/视图以外的内容引用侦听器,否则不应创建内存泄漏 - 无需在onDestroy中删除侦听器...