美文网首页
SharedPreferences模块封装

SharedPreferences模块封装

作者: KyneMaster | 来源:发表于2020-03-10 20:21 被阅读0次

    前言

    SharedPreferences 轻量级缓存使用众所周知。但是使用极其繁琐,那么现在来封装优化一下。

    目录

    目录.jpg

    基本原理

    SharedPreferences是以XML<->Map键值对的形式保存在/data/data/包名/shared_prefs文件夹下。
    注意:

    • app首次使用 SP 的时候会从磁盘读取,之后缓存在内存中。
    • 区别于其他缓存,他是每次都是重新写入,之前的xml文件会被改为备份文件,如果操作成功,备份文件就会删除。

    进一步了解自行查看源码。

    基本使用

         SharedPreferences sharedPreferences= getSharedPreferences("user",Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sharedPreferences.edit();
         editor.putString("username", username);             
         editor.commit();
    

    问题定义

    • edit 获取不爽,太麻烦
    • 每次获取SharedPreferences实例还需要传入name,那我要是忘了呢?
    • put时要传入key值,这要是团队协作,使用到缓存的信息,还要去查看他的key值,不科学,要是数据多了岂不更麻烦
    • 每次都要commit,就不能给他封装了嘛~~

    一看就不是自己人,用它给我干活不放心啊,给他包装下~

    思路与实现

    1. SharedPreferences
      先看下SharedPreferences, 他本身就是interface,一看就是采用的面向接口编程,好像在告诉我,我是干这个的,你别管我咋干的,你需要用就是了~

    2. 定义执行部分

    • 自己定义方法,创建SharedPreferences实例,实现执行,先把edit的获取包起来, 那就创建个类,通过构造函数给他实例化
      public class BasePreference {
          private SharedPreferences sharedPreferences;
          private SharedPreferences.Editor editor;
      
          public BasePreference(Context context, String name) {
              sharedPreferences = context.getSharedPreferences(name, Activity.MODE_PRIVATE);
              editor = sharedPreferences.edit();
          }
      }
      
    • 这样获取到了edit,使用他还要实现SharedPreferences的方法,那我就自己定义个~
      public interface ISharePreferences {
      
          SharedPreferences.Editor putString(String key, String value);
      
          SharedPreferences.Editor putStringSet(String key, Set<String> values);
      
          SharedPreferences.Editor putInt(String key, int value);
      
          SharedPreferences.Editor putLong(String key, long value);
      
          SharedPreferences.Editor putFloat(String key, float value);
      
          SharedPreferences.Editor putBoolean(String key, boolean value);
      
          SharedPreferences.Editor remove(String key);
      
          SharedPreferences.Editor clear();
      
          boolean commit();
      
          void apply();
      
          String getString(String key, String defValue);
          ···
      }
      
    • 这是使用的基本方法,给BasePreference实现
      public class BasePreference implements ISharePreferences {
          private SharedPreferences sharedPreferences;
          private SharedPreferences.Editor editor;
      
          public BasePreference(Context context, String name) {
              sharedPreferences = context.getSharedPreferences(name, Activity.MODE_PRIVATE);
              editor = sharedPreferences.edit();
          }
      
          @Override
          public SharedPreferences.Editor putString(String key, String value) {
              return editor.putString(key, value);
          }
      
          @Override
          public String getString(String key, String defValue) {
              return sharedPreferences.getString(key, defValue);
          }
      
          @Override
          public SharedPreferences.Editor clear() {
              return editor.clear();
          }
      
          @Override
          public boolean commit() {
              return editor.commit();
          }
      
          ···
      }
      
      
    • 好像可以了
    1. 理想使用效果
    • 首先是缓存分模块,比如用户信息缓存、设置配置缓存等等
      public class UserPreferences {
      
          private static final String TAG ="UserPreferences";
      
          public UserPreferences(Context context) {
              
          }
      
      
    • 然后使用不能太费劲,直接看类名就知道干啥的才行,定义功能接口
      public interface IUserPreferences {
      
          String getUserName();
      
          void saveUserName(String value);
      
      }
      
      
    • 实现功能
      public class UserPreferences implements IUserPreferences {
          ···
      }
      
    • 怎么用Base类好呢?
    1. 业务功能和公用功能分离
    • 正常使用执行类,还需要引入ISharePreferences接口对象,实现包装父类。
      public interface IPreference {
      
          ISharePreferences getPreferences();
      
          void commit();
      
          void clear();
      
          void remove(String key);
      }
      
      public class DefaultPreference implements IPreference {
      
          private ISharePreferences sharePreferences;
      
          public DefaultPreference(Context context, String name){
              sharePreferences = new BasePreference(context, name);
          }
      
          @Override
          public ISharePreferences getPreferences() {
              return sharePreferences;
          }
      
          @Override
          public void commit() {
              getPreferences().commit();
          }
      
          @Override
          public void clear() {
              getPreferences().clear().commit();
          }
      }
      
    • 这样公用功能和ISharePreferences对象在父类实现,还差一点,name还要传入构造函数,下面来去掉,模块类名作为name自动传入
      public class DefaultPreference implements IPreference {
      
          private String TAG = "DefaultPreference";
          private ISharePreferences sharePreferences;
      
          public DefaultPreference(Context context){
              sharePreferences = new BasePreference(context, getPreferenceName());
          }
      
          public String getPreferenceName() {
              return TAG;
          }
      
          ···
      }
      
    • 这样继承父类后,覆盖该方法即可,如果是多人协同使用,既能看懂,又能约束
    1. 执行和使用结合
    • 继承DefaultPreference, 同时调整Key的规范
      public class UserPreferences extends DefaultPreference implements IUserPreferences {
      
          private static final String TAG ="UserPreferences";
      
          public UserPreferences(Context context) {
              super(context);
          }
      
          @Override
          public String getPreferenceName() {
              return TAG;
          }
      
          @Override
          public String getUserName() {
              return getPreferences().getString(IUserConstant.USER_NAME,null);
          }
      
          @Override
          public void saveUserPassword(String value) {
              getPreferences().putString(IUserConstant.USER_NAME,value).commit();
          }
          ···
      
    1. 缓存管理类
      大功告成?还差一步!通过管理类实现缓存类的管理,并在app启动时单例实例化,防止频繁获取缓存对象,导致内容问题。
      public class PreferenceManager extends BasePreferenceManager {
      
          private static volatile PreferenceManager instance;
          private IUserPreferences userPreferences;
      
          public static PreferenceManager getInstance() {
              if (instance == null) {
                  synchronized (PreferenceManager.class) {
                      if (instance == null) {
                          instance = new PreferenceManager();
                      }
                  }
              }
              return instance;
          }
      
          public IUserPreferences getUserPreferences() {
              return userPreferences;
          }
      
          private void setUserPreferences(IUserPreferences userPreferences) {
              this.userPreferences = userPreferences;
          }
      
          public void initPreferences(Context context) {
              PreferenceManager.getInstance().setUserPreferences(new UserPreferences(context));
          }
      }
      

    使用效果

    1. 在Application类中初始化
      PreferenceManager.getInstance().initPreferences(this);
      
    2. 正常使用
      IUserPreferences userPreferences = PreferenceManager.getInstance().getUserPreferences();
      //保存
      userPreferences.saveUserName("Kyne");
      //获取
      String name = userPreferences.getUserName();
      
      
      舒坦~~

    类图

    忘了咋画了 O——O~!

    代码

    代码

    相关文章

      网友评论

          本文标题:SharedPreferences模块封装

          本文链接:https://www.haomeiwen.com/subject/hlggdhtx.html