共享首选项的单身人士的Android应用上下文

问题描述:

我想重构我的项目,它有很多不必要的代码与硬编码字符串。所以我想创建单例SharedPrefsManager,我将使用Application上下文。它是否会在我的管理器类中发生静态SharedPrefs的内存泄漏原因。共享首选项的单身人士的Android应用上下文

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

为什么你如果事情需要的类的实例你之后是静态的。使'SharedPreferences'非静态。 – Vucko

+0

只要应用程序处于活动状态并且不依赖于活动生命周期,应用程序上下文就会存活,因此在此情况下无内存泄漏 –

不,它不会得到任何内存泄漏如果您使用应用程序上下文。创建SharedPrefsManager作为单例,并从Application类中初始化。这样就可以从任意位置访问

创建这样的,

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(); 
    } 
} 

从应用类可以初始化这个样子,

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

     SharedPrefsManager.init(this); 
    } 
} 

所以,你可以从任何其他类使用没有上下文。 例如:你可以使用这样的,

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

我可否知道downvote的原因..? –

+0

我没有downvote,但答案是不好的,因为你不使用getInstance这是一个单身的点:D – Vucko

+0

我只是初始化类,我从来没有使用过,当你使用,你应该调用** SharedPrefsManager。 getInstance()。setstring(“key”,“value”); **这就是我给出的例子的主要目的 –

在静态字段保持SharedPreferences不会引发内存泄露,因为首不包含Context本身