2017-08-11 37 views
1

我想重構我的項目,它有很多不必要的代碼與硬編碼字符串。所以我想創建單例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

只要應用程序處於活動狀態並且不依賴於活動生命週期,應用程序上下文就會存活,因此在此情況下無內存泄漏 –

回答

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」); **這就是我給出的例子的主要目的 –

0

在靜態字段保持SharedPreferences不會引發內存泄露,因爲首不包含Context本身