registerOnSharedPreferenceChangeListener()接近比较

ate*_*iob 5 java android listener

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

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

preferences.registerOnSharedPreferenceChangeListener(mImageView);
Run Code Online (Sandbox Code Playgroud)

(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);
Run Code Online (Sandbox Code Playgroud)

两者都运作良好,但现在我想知道:一种方法优于另一种方法吗?

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

eve*_*otc 2

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

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

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