在我维护的一些代码中,我注意到两种不同的注册共享首选项更改侦听器的方法:
(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);
两者都运作良好,但现在我想知道:一种方法优于另一种吗?
是否存在实际使用这两种方法中只有一种的情况?
答案 0 :(得分:1)
这取决于实施,在可维护性方面,一些人可能会发现一种或另一种更好的意图,有些人只是进一步考虑可读性,天然药物等。
另一方面,您可能希望防止任何泄漏和垃圾收集问题,如果成员创建mPreferencesListener
正在访问您可能在某些问题中运行的任何封闭实例方法,那么作为一个好公民你在你知道你不会使用它们之后取消注册你的监听器(例如onPause,onDestroy等)并选择静态内部类而不是成员内部类,并且在匿名和本地内部clases访问封闭实例方法/属性时要小心。
最后值得一提的是,至于现在SharedPreferencesImpl为其听众使用WeakHashMap。