为什么需要注销 OnPreferenceChangeListener?
Why is it necessary to unregister the OnPreferenceChangeListener?
我一直在关注一些教程,它说您必须注销 OnPreferenceChangeListener
。
谁能告诉我为什么?
首先,让我们看看注册是如何完成的。
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
prefs.registerOnSharedPreferenceChangeListener(this);
我们可以看到SharedPreferences
是一个全局对象,因为getApplicationContext()
returnssingle/static/global当前进程的应用对象.现在,这里有 2 个你应该取消注册的原因 OnPreferenceChangeListener
:
- 由于
SharedPreferences
包含一个侦听器列表,如果您想在不同的地方侦听同一事件,将调用第一个侦听器(不是未注册的侦听器)。
- 当您注销监听器时,GC 将清理它。想象一下,您反复打开和关闭一个 activity,它创建并注册了一个侦听器对象,然后创建了同一侦听器的一堆实例(您只需要一个)。内存泄漏最终会发生。
注意:我认为这个解释足够好,但这个答案是开放的以供编辑。
我一直在关注一些教程,它说您必须注销 OnPreferenceChangeListener
。
谁能告诉我为什么?
首先,让我们看看注册是如何完成的。
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
prefs.registerOnSharedPreferenceChangeListener(this);
我们可以看到SharedPreferences
是一个全局对象,因为getApplicationContext()
returnssingle/static/global当前进程的应用对象.现在,这里有 2 个你应该取消注册的原因 OnPreferenceChangeListener
:
- 由于
SharedPreferences
包含一个侦听器列表,如果您想在不同的地方侦听同一事件,将调用第一个侦听器(不是未注册的侦听器)。 - 当您注销监听器时,GC 将清理它。想象一下,您反复打开和关闭一个 activity,它创建并注册了一个侦听器对象,然后创建了同一侦听器的一堆实例(您只需要一个)。内存泄漏最终会发生。
注意:我认为这个解释足够好,但这个答案是开放的以供编辑。