我阅读了有关避免内存泄漏的文章。
为了避免与上下文相关的内存泄漏,请记住以下几点:
- 尝试使用
context-application
而不是context-activity
我有两个问题:
- 如果我使用
setOnClickListener(this)
,会导致内存泄漏吗? - 如果我使用
setOnClickListener(new View.OnClickListener(){})
,会导致内存泄漏吗?
我阅读了有关避免内存泄漏的文章。
为了避免与上下文相关的内存泄漏,请记住以下几点:
context-application
而不是context-activity
我有两个问题:
setOnClickListener(this)
,会导致内存泄漏吗?setOnClickListener(new View.OnClickListener(){})
,会导致内存泄漏吗?1 - 如果我使用setOnClickListener(this),会导致内存泄漏吗?
不一定会导致内存泄漏,“this”实现了OnClickListener,如果你没有自己造成泄漏……例如在onClick中运行线程会导致泄漏,使用非静态内部类会导致泄漏,所以答案是setOnClickListener(this)仅在你的onClick(View view)的实现中造成泄漏时才会泄漏。
2 - 如果我使用setOnClickListener(new View.OnClickListener(){}), 会导致内存泄漏吗?
这是同样的问题,取决于你为OnClickListener.onClick实现了什么……不要泄漏实现new View.OnclickListener的类……那么就没问题了。
我觉得你两种方法都可以使用。不过,如果你有多个按钮(或其他控件),最好使用第一种解决方案并使用getId()来区分它们,第二种方法会为每个按钮创建一个不同的监听器(对象),所以会占用更多的内存。我认为它们都不会导致内存泄漏,因为当你销毁一个活动,并且没有留下与之相关的链接时,Java GC会将那部分内存(即监听器对象)释放给Dalvik。
希望对你有所帮助:)
onSettingsHeaderMenuItemClickedListener = View.OnClickListener {
GuidedStepSupportFragment.add(requireActivity().supportFragmentManager, SettingsFragment.newInstance(), android.R.id.content)
}
class SomeFragment{
private var onSettingsHeaderMenuItemClickedListener by autoCleared<View.OnClickListener>()
fun onViewCreated(){
onSomethingItemClickedListener = View.OnClickListener {
GuidedStepSupportFragment.add(requireActivity().supportFragmentManager, SettingsFragment.newInstance(), android.R.id.content)
}
findViewById<View>(R.id.header_item_settings).setOnClickListener(onSettingsHeaderMenuItemClickedListener)
}
}