0

假设在Activity A中,我获得了一个名为sharedPrefs的SharedPreferences实例,然后我在其上调用registerOnSharedPreferenceChangeListener(myListener)方法,传递一个名为myListener的OnSharedPreferenceChangeListener对象,以对sharedPrefs链接到的首选项的更改做出反应。

我的问题如下:即使sharedPrefs超出范围,即被销毁/垃圾收集,myListener的onSharedPreferenceChanged方法是否也会被调用,或者我是否需要在Activity A实例变量中保存对sharedPrefs指向的对象的引用确定我会在整个Activity A生命周期中收到更改的首选项事件吗?

4

2 回答 2

0

由于实例有一个注册的监听器,这两个对象不会被垃圾回收,监听器会被调用。

于 2012-05-22T18:48:53.477 回答
0

我认为我的问题的答案可能是:是的,当它连接到的SharedPreferences实例被垃圾收集时, OnSharedPreferenceChangeListener死亡(即不再被调用),但是一旦使用getSharedPreferences获得引用,它就不会发生(或类似方法)超出范围,因为该方法返回一个单例,即对返回的对象有一个静态引用,存储在某处,这将使对象保持活动状态。因此您不必担心存储getSharedPreferences返回的对象(尽管您可以避免再次调用getSharedPreferences),因为这些方法总是返回对同一个对象的引用。您唯一需要担心的是存储对您传递给registerOnSharedPreferenceChangeListener的OnSharedPreferenceChangeListener对象的引用,以便在您需要在 unregisterOnSharedPreferenceChangeListener 中取消注册它们时这里您需要传递您传递给register方法的相同实例,否则它们是不是未注册的)。感谢 ChristopheCVB 为我指明了正确的方向。

于 2012-05-28T06:15:48.707 回答