5

I read about avoiding memory leaks

to avoid context-related memory leaks, remember the following:

  • Try using the context-application instead of a context-activity

And I have 2 questions :

  1. If I use setOnClickListener(this), will it cause a memory leak?
  2. If I use setOnClickListener(new View.OnClickListener(){}), will it cause a memory leak?
4

3 回答 3

1

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

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

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

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

于 2018-12-21T02:18:54.370 回答
0

I would say you can use both. Although, if you have more than one buttons (or any other widget), better to use first solution with getId() to diference them, the second one creates a diferent listener (object) for each button , so it reserves more memory. I dont think any of them causes memory leaks, because when you destroy an activity, and no links left for it, java GC gives back that memory (the listener objects) to dalvik.

hope it helps:)

于 2012-09-23T14:17:37.903 回答
0

这可能有点晚了,但是我想将其添加到上面的答案中:这取决于您在 OnClickListener 中做什么,假设您引用的是片段父级的 Activity 并且您为片段内的视图重新设置此 OnClickListener 则您可能需要删除您的引用,否则您有泄漏内存的风险:

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

例如,上面的代码引用了父activity内部的fragment manager,并且发生在一个fragment中,所以这个引用必须被清除,否则它会将整个activity和fragment一起泄漏!

我更喜欢使用我可以从Google architecture components sample中挑选的 autoCleared 委托来解决这个问题。

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

    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)
        }
    }
    
于 2020-11-05T09:01:23.170 回答