2017-08-11 3 views
1

Je veux refactoriser mon projet et il a beaucoup de code inutile avec une chaîne codée en dur. Donc, je voulais créer Singleton SharedPrefsManager, je vais utiliser le contexte de l'application. survient-il une cause de fuite de mémoire de SharedPrefs statique dans ma classe de gestionnaire.Contexte Android App pour singleton à Préférences partagées

public class SharedPrefsManager { 

    private static SharedPrefsManager sharePref = new SharedPrefsManager(); 
    private static SharedPreferences sharedPreferences; 

    private SharedPrefsManager() {} 


    public static SharedPrefsManager getInstance(Context context) { 
     if (sharedPreferences == null) { 
      sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE); 
     } 
     return sharePref; 
    } 

} 
+1

Pourquoi auriez-vous besoin d'une instance de la classe si la chose Vous êtes après, c'est statique aussi. Rendez les 'SharedPreferences' non-statiques. – Vucko

+0

Le contexte de l'application va vivre tant que votre application est active et ne dépend pas du cycle de vie des activités, donc pas de fuite de mémoire dans ce cas –

Répondre

0

Non, il n'y aura pas de fuite de mémoire si vous utilisez un contexte d'application. Créez le SharedPrefsManager en tant que singleton et initialisez à partir de votre classe Application. afin que vous puissiez accéder de partout

Créer comme ça,

public class SharedPrefsManager { 
    private static SharedPrefsManager mInstance= null; 
    private SharedPreferences sharedPreferences; 
    private SharedPreferences.Editor prefsEditor; 

    private SharedPrefsManager(Context context) { 
     sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE); 
     prefsEditor = sharedPreferences.edit(); 
    } 

    public static void init(Context context) { 
     mInstance = new SharedPrefsManager(context); 

    } 


    public static SharedPrefsManager getInstance() { 
     if (mInstance == null) { 
      throw new RuntimeException(
        "Must run init(Application application) before an instance can be obtained"); 
     } 
     return mInstance; 
    } 

    /** 
    * To get the Stored string value in Preference. 
    * 
    * @param key 
    * @param defaultvalue 
    * @return stored string value. 
    */ 
    public String getStringValue(final String key, final String defaultvalue) { 
     return sharedPreferences.getString(key, defaultvalue); 
    } 

    /** 
    * To store the string value in prefernce. 
    * 
    * @param key 
    * @param value 
    */ 
    public void setStringValue(final String key, final String value) { 
     prefsEditor.putString(key, value); 
     prefsEditor.commit(); 
    } 
} 

De classe d'application, vous pouvez initialiser comme celui-ci,

public class StackApp extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     SharedPrefsManager.init(this); 
    } 
} 

Alors que vous pouvez utiliser à partir de toute autre classe sans contexte. Ex: vous pouvez utiliser comme ça,

SharedPrefsManager.getInstance().setStringValue("key", "value"); 
+0

Puis-je connaître la raison de la baisse des valeurs ..? –

+0

Je n'ai pas downvote mais la réponse est mauvaise parce que vous n'utilisez pas getInstance qui est le point d'un singleton: D – Vucko

+0

Je viens d'initialiser la classe, je n'ai jamais utilisé cela, alors que vous utilisez, vous devriez appeler ** SharedPrefsManager. getInstance(). setstring ("key", "value"); ** c'est le but principal de l'exemple que j'ai donné –

0

tenant SharedPreferences dans le champ statique ne provoque pas de fuite de mémoire parce que les préférences ne contient pas lui-même Context