登录

去注册

登录

注册

去登录

注册

每日一问 对于SharedPreferences你觉得有什么优缺点?

xiaoyang   2019-07-02   收藏

缺点可以从 Sp 导致卡顿,内存占用方面分析。



本周1/3

4

SharedPreferences,它是一个轻量级的存储类,特别适合用于保存软件配置参数  。

优点:

1.轻量级,以键值对的方式进行存储,使用方便,易于理解

2.采用的是xml文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息

缺点:

1.有于是对文件IO读取,因此在IO上的瓶颈是个大问题,因为在每次进行get和commit时都要将数据从内存写入到文件中,或从文件中读取

2.多线程场景下效率较低,在get操作时,会锁定SharedPreferences对象,互斥其他操作,而当put,commit时,则会锁定Editor对象,使用写入锁进行互斥,在这种情况下,效率会降低

3.不支持跨进程通讯

4.由于每次都会把整个文件加载到内存中,因此,如果SharedPreferences文件过大,或者在其中的键值对是大对象的json数据则会占用大量内存,读取较慢是一方面,同时也会引发程序频繁GC,导致的界面卡顿。

基于以上缺点:

1.建议不要存储较大数据或者较多数据到SharedPreferences中

2.频繁修改的数据修改后统一提交,而不是修改过后马上提交

3.在跨进程通讯中不去使用SharedPreferences

4.键值对不宜过多

回复
Alex_Lin : @mailof8344@gmail.com 

所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败

2019-07-04 回复
mailof8344@gmail.com : @Alex_Lin 

另外,我有一个疑问,apply的好处是不是在于:高并发情况下,apply两次,存入内存两次,但数据从内存存入磁盘只需要一次;而commit方法是等前一个完全存入磁盘后,才执行下一个commit方法,这  ...查看更多

2019-07-03 回复
mailof8344@gmail.com : @Alex_Lin 

在看到这个提问前,我是一脸懵逼。参考您的评论内容,自己也经过一些源码研究后,下面是一些个人的理解: 1,sp只在创建SharePreferencesImpl实例时,才会将磁盘的文件加载进内存;getX  ...查看更多

2019-07-03 回复
Alex_Lin : @LewChich 

能不用就不用

2019-07-01 回复
Xu : @LewChich 

跨进程可以使用微信的MMKV

2019-07-01 回复
陈小缘 : @Alex_Lin 

棒!赞一个~

2019-07-01 回复
LewChich : @Alex_Lin 

有没有 推荐的更优解呢

2019-07-01 回复
1

从源码、注意事项、和建议三方面详细讲了一下 SharedPreferences 
https://www.jianshu.com/p/4025d02a8380

回复
1

我来说一下安全方面的吧:对于root的手机,对应的xml文件可以导出来,当然也可以修改,敏感信息还是不要用这个存。  

回复
1
回复
mailof8344@gmail.com : @525721508@qq.com 

学习了

2019-07-03 回复
1
  • 当看到这个问题的时候我第一时间百度,然后学习了源码
  • 了解到的是不支持跨进程和不能存大量数据,频繁的读写修改后 统一提交
  • 对于sp使用场景上面的哥们说得很正确了,轻量级的xml储存,说到程序卸载后会也会一并被清除,不会残留信息,但对于app升级后,sp还是会有的,一般升级判断versioncode都是通过sp
  • 当最开始使用的时候对于apply()和commit()这2个方法很是纠结,因为IDE推荐使用apply(),一般博客都是commit()
  • commit方法,每次执行时同步写入磁盘
  • apply方法,每次执行时在单线程池中加入写入磁盘Task,异步写入。

    commit和apply的方法区别在于同步写入和异步写入,以及是否需要返回值。
    在不需要返回值的情况下,使用apply方法可以极大的提高性能。
    多个写入操作可以合并为一个commit/apply,将多个写入操作合并后也能提高IO性能。

回复
1

一般量少就用sp,不支持跨进程是个问题,它在内存里面有缓存,跨进程改了卵用都没。

所以一般情况用sp,需要跨进程就用的mmkv

回复
1

优点,我可以不写代码

回复
0

SharedPreferences为我们提供了轻量级存储能力,方便了少量数据的持久化。优点自然是简单易用,不过存储类型有限制,只能是字符串型、基本类型的值。

缺点:1.不支持跨进程 2.原生API的限制主要有以下两方面:(1)IO瓶颈 (2)锁性能差 3.对SP的不当封装也会间接造成数据读写性能差。

回复
0

简单好用啊,一行代码就可以存,可以取。想存啥存啥。

是个app,总要存点东西,这个方便。

至于啥跨进程,没这需求。

卡顿,没发现,感觉挺好的。

回复
0

方便快捷

缺点 不宜存大数据,容易被清除

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定