5

在我维护的一些代码中,我注意到注册共享首选项更改侦听器的两种不同方法:

(1) 直截了当的方法,其中包含已注册成员函数的类实现SharedPreferences.OnSharedPreferenceChangeListener

preferences.registerOnSharedPreferenceChangeListener(mImageView);

(2) 间接方法,其中可能包含已注册成员函数的类由于某种原因倾向于不实现SharedPreferences.OnSharedPreferenceChangeListener,而是选择定义和实例化一个专用于该侦听器的全新类:

SharedPreferences.OnSharedPreferenceChangeListener mPreferencesListener = 
  new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
      // do here what's needed to do
    }
  };


....

preferences.registerOnSharedPreferenceChangeListener(mPreferencesListener);

两者都运作良好,但现在我想知道:一种方法比另一种更可取吗?

是否存在实际上只能使用这两种方法中的一种的情况?

4

1 回答 1

2

这取决于实现,就可维护性而言,有些人可能会发现一种或其他方式更符合他们的意图,有些人只是进一步考虑可读性、自然医学等。

另一方面,您当然可能希望防止任何泄漏和垃圾收集问题,如果创建的成员mPreferencesListener正在访问您可能在某些问题中运行的任何封闭实例方法,作为一个好公民,您应该在知道之后取消注册您的侦听器您将不会使用它们(例如 onPause、onDestroy 等)并选择静态内部类而不是成员内部类,并且在匿名和本地内部类访问封闭实例方法/属性时要小心。

最后值得一提的是,目前SharedPreferencesImpl使用Wea​​kHashMap作为其侦听器。

于 2012-08-25T19:08:48.413 回答