【问题标题】:Singleton class with shared preferences, pass in Context everytime or store it具有共享偏好的单例类,每次传入 Context 或存储
【发布时间】:2016-04-19 10:15:57
【问题描述】:

我正在创建一个静态的单例类,因为它需要从任何地方访问。此类需要经常写入共享首选项。要创建共享引用对象,我需要上下文。

我读到在静态类中存储对 Context 的引用是个坏主意,因为上下文不能被垃圾收集,尤其是当它是活动时。

因此,我创建了在需要写入以共享首选项的任何地方的方法,我在上下文中传递。这会导致创建共享首选项对象、存储数据,然后删除该对象。

这样好吗?为什么或为什么不?

谢谢

【问题讨论】:

  • 是的,没关系。我一直使用这种方法来避免 biolerplate 代码

标签: android sharedpreferences


【解决方案1】:

你可以简单

SharedPreferences pref = PreferenceManager.
       getDefaultSharedPreferences(context.getApplicationContext());

因此,无论何时context 最终确定,您都不会在意,因为您使用的是应用程序上下文

【讨论】:

  • 那么将ApplicationContext作为变量存储在静态类中是安全的吗?
【解决方案2】:
public ClassSingle{

       private static ClassSingle classSingle = null;

        public ClassSingle(Context context) {
          //default values of variable if any
        }

       synchronized public static ClassSingle getInstance(Context context) {
           if (classSingle == null) {
               String configJson = context.getSharedPreferences(ApplicationConstants.PREF_FILE_CONFIG, Context.MODE_PRIVATE)
                .getString(ApplicationConstants.EXTRA_KEY, null);
              try {
                  classSingle = new Gson().fromJson(configJson, ClassSingle.class);
              } catch (JsonSyntaxException e) {
                  e.getStackTrace();
              }

              if (classSingle == null) {
                 classSingle = new ClassSingle(context);
         }
      }
      return classSingle;
     }
}

使用这种方式创建类单例并在任何地方获取实例。如果不存在,它将创建新实例,否则将返回现有实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2021-04-01
    • 2014-12-17
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多