内存泄漏与setOnClickListener(this)和setOnClickListener(new View.On



我读到关于避免内存泄漏的信息

为避免与上下文相关的内存泄漏,请记住以下几点:

  • 尝试使用context-application而不是context-activity

我有两个问题:

  1. 如果我使用 setOnClickListener(this) ,会导致内存泄漏吗?
  2. 如果我使用 setOnClickListener(new View.OnClickListener(){}) ,会导致内存泄漏吗?

1 - 如果我使用 setOnClickListener(this),它会导致内存泄漏吗?

没有必要,"this"实现了OnClickListener,如果你不泄漏自己...例如,在onClick中运行线程会泄漏,使用非静态内部类会泄漏,所以答案是setOnClickListener(this)只有在onClick(View view)的实现泄漏时才会泄漏。

2 - 如果我使用 setOnClickListener(new View.OnClickListener(){}),它会导致内存泄漏吗?

是同样的问题,取决于你为OnClickListener.onClick实现什么...不要泄漏类,如果你实现了新的View.OnclickListener...。你会没事的。

我会说你可以同时使用两者。虽然,如果您有多个按钮(或任何其他小部件),最好使用带有getId()的第一个解决方案来区分它们,第二个解决方案为每个按钮创建一个不同的侦听器(对象),因此它保留更多内存。我不认为它们中的任何一个会导致内存泄漏,因为当您销毁一个活动并且没有为其留下链接时,java GC 会将该内存(侦听器对象)返回给 dalvik。

希望有帮助:)

这可能有点

晚了,但我想将其添加到上面的答案中: 这取决于您在 OnClickListener 中执行的操作,假设您引用的活动是片段的父级,并且您正在为片段内的视图设置此 OnClickListener,那么您可能需要删除您的引用或存在泄漏内存的风险:

onSettingsHeaderMenuItemClickedListener = View.OnClickListener {
            GuidedStepSupportFragment.add(requireActivity().supportFragmentManager, SettingsFragment.newInstance(), android.R.id.content)
}

例如,上面的代码引用了父活动内部的片段管理器,并且发生在一个片段中,所以必须清除引用,否则它将整个活动和片段一起泄漏!

我更愿意使用自动清除委派来解决此问题,我可以从 Google 架构组件示例中选择该委派。

因此,当在片段内并且需要来自活动的引用时,单击侦听器的整个实现将类似于下面的代码:

    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)
        }
    }
    

它不会泄漏,因为 JVM 上的垃圾回收不是基于引用计数(就像在 iOS 上一样),而是基于"标记扫描"GC。

相关内容

  • 没有找到相关文章

最新更新