Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnSharedPreferenceChangeListener是否与注册它的SharedReference实例一起死亡?_Android_Listener_Sharedpreferences_Onchange_Android Preferences - Fatal编程技术网

Android OnSharedPreferenceChangeListener是否与注册它的SharedReference实例一起死亡?

Android OnSharedPreferenceChangeListener是否与注册它的SharedReference实例一起死亡?,android,listener,sharedpreferences,onchange,android-preferences,Android,Listener,Sharedpreferences,Onchange,Android Preferences,假设在活动A中,我得到一个名为SharedPreferences的SharedPreferences实例,然后对其调用registerOnSharedPreferenceChangeListener(myListener)方法,传递一个名为myListener的OnSharedPreferenceChangeListener对象,以对SharedPrefers链接到的首选项的更改做出反应 我的问题是:myListener的onSharedPreferenceChanged方法是否在sharedP

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


我的问题是:myListener的onSharedPreferenceChanged方法是否在sharedPrefs超出范围(即被销毁/垃圾收集)时被调用,或者,我是否需要将对sharedPrefs指向的对象的引用保存在活动实例变量中,以确保在活动的整个生命周期中收到更改的首选项事件

由于实例有一个已注册的侦听器,因此不会对这两个对象进行垃圾收集并调用侦听器。

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

你有没有尝试过挑起这个问题?通过创建两个SharePreference实例?没有,我会尽快尝试,同时我问这里是否有人给我一个关于对象范围和生命的与java相关的问题的答案。好的,那么我有另一个答案她的问题..如果我想注销侦听器,如果我不再有对SharedRefers的引用,我怎么做?如果它像你说的那样工作,我不能在另一个SharedReferences实例上调用UnregisteredSharedPreferenceChangeListener,比如SharedRefers2,对吗?我会为此发布另一个问题。你的意思是我说的是正确的或者我可以在不同于register的实例上调用unregister…?我认为这两个SharedReference是相同的,因为您不是在创建它们,而是从上下文中获取它们…所以您可以使用引用注册并从另一个实例注销…只是尝试了一下,它就如您所说的那样工作,因为GetSharedReferences总是返回给定首选项文件名的同一SharedReferences实例。我认为,鉴于GetSharedReferences(java.lang.String,int)总是为给定字符串(即首选项文件)返回相同的SharedReferences对象这一事实,这意味着对该实例的引用必须保存在SharedReferences的静态变量中,因此,即使您的所有引用都超出范围,在您第一次检索特定首选项文件的SharedReferences实例后,始终会有对该实例的引用,对吗?