我读过关于avoiding memory leaks的文章
要避免与上下文相关的内存泄漏,请记住以下事项:
- 尝试使用
context-application
而不是context-activity
我有两个问题:
1.如果我使用setOnClickListener(this)
,它会导致内存泄漏吗?
1.如果我使用setOnClickListener(new View.OnClickListener(){})
,它会导致内存泄漏吗?
我读过关于avoiding memory leaks的文章
要避免与上下文相关的内存泄漏,请记住以下事项:
context-application
而不是context-activity
我有两个问题:
1.如果我使用setOnClickListener(this)
,它会导致内存泄漏吗?
1.如果我使用setOnClickListener(new View.OnClickListener(){})
,它会导致内存泄漏吗?
4条答案
按热度按时间34gzjxbg1#
不需要,“this”实现OnClickListener,并且如果您不泄漏自己...例如,在onClick中运行线程将泄漏,使用非静态内部类将泄漏,因此答案是setOnClickListener(this)仅在您的**onClick(视图视图)**实现泄漏时才会泄漏。
这是同一个问题,取决于您为OnClickListener. onClick实现了什么...如果您实现了new View.OnclickListener...,则不要泄漏类,这样就不会有问题。
hs1rzwqc2#
我会说你可以两个都用。虽然,如果你有一个以上的按钮(或任何其他小部件),最好使用带有getId的第一个解决方案()为了区分它们,第二个创建不同的侦听器(对象)为每个按钮,所以它保留了更多的内存。我不认为它们中的任何一个会导致内存泄漏,因为当你破坏一个活动,并且没有为它留下链接时,java GC将内存(侦听器对象)返还给dalvik。
希望对你有帮助:)
gwbalxhn3#
这可能有点晚了,但我想在上面的回答中补充一点:这取决于您在OnClickListener中执行的操作,比方说,如果您引用的Activity是片段的父级,并且您要为片段内的视图设置此OnClickListener,则您可能需要删除引用,否则会有内存泄漏的风险:
例如,上面的代码引用了父Activity内部的片段管理器,并且发生在一个片段中,所以引用必须被清除,否则它会同时泄漏整个Activity和片段!
我更愿意使用autoCleared委托来修复此问题,我可以从Google architecture components sample中选择此委托。
因此,当click侦听器在片段内部并且需要来自Activity的引用时,其整个实现将类似于以下代码:
uoifb46i4#
它不会泄漏,因为JVM上的垃圾收集不是基于引用计数(像在iOS上那样),而是基于"mark-sweep" GC。