SharedPrefereses的优化与缺点

SharedPreferences

性能

ShredPreferences是单例对象,第一次打开后,之后获取都无需创建,速度很快。
当第一次获取数据后,数据会被加载到一个缓存的Map中,之后的读取都会非常快。
当由于是XML<->Map的存储方式,所以,数据越大,操作越慢,
get、commit、apply、remove、clear都会受影响,所以尽量把数据按功能拆分成若干份。

Android 五种数据存储的配置信息方式之一。
ContentProvider:将应用的私有数据提供给其他应用使用;
文件存储:以IO流形式存放,可分为手机内部和手机外部(sd卡等)存储,可存放较大数据;
SQLite:轻量级、跨平台数据库,将所有数据都是存放在手机上的单一文件内,占用内存小;
网络存储 :数据存储在服务器上,通过连接网络获取数据。

Sharedpreferences(不建议使用)是Android平台上一个轻量级的存储类,用来保存应用程序的各种配置信息,其本质是一个以“键-值”对的方式保存数据的xml文件,其文件保存在/data/data//shared_prefs目录下。

SharedPreferences可以保存的数据类型有:int、boolean、float、long、String、StringSet。

在全局变量上看,其优点是不会产生Application 、 静态变量的OOM(out of memory)和空指针问题,其缺点是效率没有上面的两种方法高。

SharedPreferences只能存储少量数据,大量数据不能使用该方式存储
还有腾讯的MMKV,Jetpack的DateStore,都用于配置信息

保存数据一般分为四个步骤:

使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
使用SharedPreferences接口的edit获得SharedPreferences.Editor对象;
通过SharedPreferences.Editor接口的putXXX方法保存key-value对;
通过过SharedPreferences.Editor接口的commit方法保存key-value对。

读取数据

读取数据一般分为两个步骤:

使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
通过SharedPreferences对象的getXXX方法获取数据;

提交分为两个方法

commit和apply

SharedPreferences用来进程间共享数据,它只能存储简单数据类型(int、boolean、String 等)

复杂数据类型建议使用文件、数据库等其他方式存储。

SharedPreference 提 交 数 据 时 , 尽 量 使 用 Editor#apply(),而非Editor#commit()。

使用场景:

一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使用 Editor#commit()。

SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入磁盘,

apply没有返回值,而commit返回boolean表明修改是否提交成功

apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘;

而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。

而apply只是原子的提交到内存,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率,apply方法不会提示任何失败的提示

commit方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit,apply会将最后修改内容写入磁盘。
但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit。

apply存数据

        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("name", "lala");
        editor.putInt("age", 18);
        editor.putBoolean("man", true);
        editor.apply();

apply取数据

        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
        String name = sp.getString("name", "aaa");
        int age = sp.getInt("age", 0);
        boolean man = sp.getBoolean("man", false);

获取Editor对象(由SharedPreferences对象调用)

abstract SharedPreferences.Editor edit()

写入数据(由Editor对象调用)

//写入boolean类型的数据
abstract SharedPreferences.Editor   putBoolean(String key, boolean value)
//写入float类型的数据
abstract SharedPreferences.Editor   putFloat(String key, float value)
//写入int类型的数据
abstract SharedPreferences.Editor   putInt(String key, int value)
//写入long类型的数据
abstract SharedPreferences.Editor   putLong(String key, long value)
//写入String类型的数据
abstract SharedPreferences.Editor   putString(String key, String value)
//写入Set<String>类型的数据
abstract SharedPreferences.Editor   putStringSet(String key, Set<String> values)

清空数据(由Editor对象调用)

abstract SharedPreferences.Editor   clear()

提交数据(由Editor对象调用)

abstract boolean    commit()

读取数据(由SharedPreferences对象调用)

//读取所有数据
abstract Map<String, ?> getAll()
//读取的数据为boolean类型
abstract boolean    getBoolean(String key, boolean defValue)
//读取的数据为float类型
abstract float  getFloat(String key, float defValue)
//读取的数据为int类型
abstract int    getInt(String key, int defValue)
//读取的数据为long类型
abstract long   getLong(String key, long defValue)
//读取的数据为String类型
abstract String getString(String key, String defValue)
//读取的数据为Set<String>类型
abstract Set<String>    getStringSet(String key, Set<String> defValues)

SharedPreferences简单的用法

    /**
     * 保存用户信息
     */
    private void saveUserInfo(){
   
        SharedPreferences userInfo = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = userInfo.edit();//获取Editor
        //得到Editor后,写入需要保存的数据
        editor.putString("username", "一只猫的涵养");
        editor.putInt("age", 20);
        editor.commit();//提交修改
        Log
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值