SharedPreferences的使用二

      上一节介绍了如何获取SharedPreferences,已经如何修改Context保存位置。大家知道SharedPreferences是用来保存数据的,那么当然就少不了对数据的增删改查,这一节我们来具体学习下。

      在学习之前我们先来看下源码,SharedPreferences是一个接口他的源码如下

   //获取所有的存储的值
    Map<String, ?> getAll();

    //获取存储的String类型的值
    String getString(String key, @Nullable String defValue);
   //获取存储的String类型的set集合
    Set<String> getStringSet(String key, @Nullable Set<String> defValues);
   //获取存储的int类型的值
    int getInt(String key, int defValue);
   //获取存储的long类型的值
    long getLong(String key, long defValue);
   //获取存储的float类型的值
    float getFloat(String key, float defValue);
   //获取存储的boolean类型的值
    boolean getBoolean(String key, boolean defValue);
   //查看是否存储对应key的值
    boolean contains(String key);
   //获取编辑器
    Editor edit();
   //注册SharedPreferences值变化监听器
    void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
    
   //注销SharedPreferences值变化监听器
    void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);

通过查看源代码我们发现没有删除、修改、添加的方法,那么他的值是怎么添加、删除、修改呢?其中我们发现有一个方法获取一个Editor对象的方法,这个Editor是什么呢,有名字可以知道是一个编辑器,那么这个编辑器是干什么用的呢?为了了解Editor的作用,我们先查看下源代码,Editor是一个接口

       //存放,修改String类型的值
        Editor putString(String key, @Nullable String value);
       //存放,修改String类型的set集合
        Editor putStringSet(String key, @Nullable Set<String> values);
       //存放,修改int类型的值
        Editor putInt(String key, int value);
       //存放,修改long类型的值
        Editor putLong(String key, long value);
       //存放,修改float类型的值
        Editor putFloat(String key, float value);
       //存放,修改boolean类型的值
        Editor putBoolean(String key, boolean value);
       //删除key键所对应的值
        Editor remove(String key);
       //清空
        Editor clear();
       //提交,同步提交到磁盘
        boolean commit();
       //提交,异步保存到磁盘
        void apply();

通过查看源码可以知道Editor作用就是对SharedPreferences中的数据进行增、删、查。为什么需要一个提交的方法而不是每次添加数据后直接提交了,这是为了方便保存多条数据的时候避免多次提交,用空间换时间。

       下面我们来看看Editor的实现,具体实现是在android.app.SharedPreferencesImpl$EditorImpl,这里我们只看一个string类型的保存,首先看看源代码

      private final Object mLock = new Object();//同步锁

        private final Map<String, Object> mModified = Maps.newHashMap();//数据暂存区
       //存放数据,将数据放入暂存区
        public Editor putString(String key, @Nullable String value) {
            synchronized (mLock) {
                mModified.put(key, value);
                return this;
            }
        }

     提交数据就是一个数据同步到SharedPreferences中,然后再写到文件中的过程,这里就不介绍了。

     下面我们再来看看SharedPreferences的实现,具体实现是在android.app.SharedPreferencesImpl,这里我们也只看获取string类型值,首先看看源代码

    public String getString(String key, @Nullable String defValue) {
        synchronized (mLock) {
            awaitLoadedLocked();//等待加载
            String v = (String)mMap.get(key);//从map中获取数据
            return v != null ? v : defValue;
        }
    }

从方法中我们发现数据的来源也是在map中,为什么要放一个中间的map而不是每次从xml文件中获取,其实这也是一个空间换取时间的方式,为了更快的响应,所以就把数据放入map中,每次只读取一次xml文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值