From d45bc14cce248a58d93a78c29cc3d609f45fec4f Mon Sep 17 00:00:00 2001 From: Conor O'Donnell Date: Fri, 6 Jul 2018 13:02:00 -0700 Subject: [PATCH] Keep strong reference to OnSharedPreferenceChangeListener (#131) Summary: A strong reference to the listener should be kept when calling `registerOnSharedPreferenceChangeListener`, otherwise the listener can get garbage-collected and stop working. Mentioned in the Android SDK docs [here](https://developer.android.com/reference/android/content/SharedPreferences.html#registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener)): > Caution: The preference manager does not currently store a strong reference to the listener. You must store a strong reference to the listener, or it will be susceptible to garbage collection. We recommend you keep a reference to the listener in the instance data of an object that will exist as long as you need the listener. Closes https://github.com/facebook/Sonar/pull/131 Differential Revision: D8751484 Pulled By: xiphirx fbshipit-source-id: e46715d637c89491770c266fc22c27db41beb042 --- .../SharedPreferencesSonarPlugin.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/android/plugins/sharedpreferences/SharedPreferencesSonarPlugin.java b/android/plugins/sharedpreferences/SharedPreferencesSonarPlugin.java index 0e987c7e1..d4c978fc6 100644 --- a/android/plugins/sharedpreferences/SharedPreferencesSonarPlugin.java +++ b/android/plugins/sharedpreferences/SharedPreferencesSonarPlugin.java @@ -23,6 +23,24 @@ public class SharedPreferencesSonarPlugin implements SonarPlugin { private SonarConnection mConnection; private final SharedPreferences mSharedPreferences; + private final SharedPreferences.OnSharedPreferenceChangeListener + onSharedPreferenceChangeListener = + new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (mConnection == null) { + return; + } + mConnection.send( + "sharedPreferencesChange", + new SonarObject.Builder() + .put("name", key) + .put("deleted", !mSharedPreferences.contains(key)) + .put("time", System.currentTimeMillis()) + .put("value", mSharedPreferences.getAll().get(key)) + .build()); + } + }; /** * Creates a {@link android.content.SharedPreferences} plugin for Sonar @@ -54,23 +72,7 @@ public class SharedPreferencesSonarPlugin implements SonarPlugin { */ public SharedPreferencesSonarPlugin(Context context, String name, int mode) { mSharedPreferences = context.getSharedPreferences(name, mode); - - mSharedPreferences.registerOnSharedPreferenceChangeListener( - new SharedPreferences.OnSharedPreferenceChangeListener() { - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (mConnection != null) { - mConnection.send( - "sharedPreferencesChange", - new SonarObject.Builder() - .put("name", key) - .put("deleted", !mSharedPreferences.contains(key)) - .put("time", System.currentTimeMillis()) - .put("value", mSharedPreferences.getAll().get(key)) - .build()); - } - } - }); + mSharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); } @Override