【问题标题】:Android App context for singleton at Shared preferences共享首选项中单例的 Android 应用程序上下文
【发布时间】:2017-08-11 17:25:44
【问题描述】:

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

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

}

【问题讨论】:

  • 如果你所追求的东西也是static,为什么你还需要一个类的实例。使SharedPreferences 非静态。
  • 只要您的应用程序处于活动状态并且不依赖于活动生命周期,应用程序上下文就会存在,因此在这种情况下不会发生内存泄漏

标签: android memory-leaks sharedpreferences


【解决方案1】:

在静态字段中保存SharedPreferences 不会引起内存泄漏,因为首选项本身不包含Context

【讨论】:

    【解决方案2】:

    不,如果您使用应用程序上下文,它不会发生任何内存泄漏。将 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();
        }
    }
    

    从Application类你可以这样初始化,

    public class StackApp extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
    
            SharedPrefsManager.init(this);
        }
    }
    

    这样您就可以在没有上下文的情况下从任何其他类中使用。 例如:你可以这样使用,

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

    【讨论】:

    • 我没有投反对票,但答案很糟糕,因为您没有使用 getInstance,这是单例的重点:D
    • 我只是初始化类,我没用过,你用的时候,你应该调用** SharedPrefsManager.getInstance().setstring("key", "value");** 那就是我给出的例子的主要目的
    • 我在答案中添加了我们应该如何使用该类的示例,看看。如果这不好,你可以建议我,你也可以添加一个答案,这样每个人都会从中受益。
    • 但是将 SharedPreferences 保持在静态中没有内存泄漏问题,因为它不使用上下文。你需要上下文来获取它们
    • @PotapovAnton,我从来没有说过这会导致内存泄漏检查我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多