更多问答 >>
-
每日一问 | getWidth, getMeasuredWidth 有什么区别?
2019-07-05 00:48 -
每日一问 对于代码中有大量的 if/else 你有什么优化思路?
2019-07-07 23:00 -
每日一问 在Activity 的 onResume 方法中 handler.postRunnable 能获取到 View 宽高吗?
2019-07-09 21:03 -
每日一问 在Activity 的 onResume 方法中 view.postRunnable 能获取到 View 宽高吗?
2019-07-11 23:28 -
2019-07-14 21:09
-
每日一问 ANR的产生的原理是什么,AMS中涉及ANR的代码有哪些?
2019-06-30 22:33 -
每日一问 | 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?
2019-06-27 23:50 -
每日一问 有没有使用过 DataBinding ,有什么优点、缺点,遇到过哪些坑?
2019-06-26 00:23 -
每日一问 View中的getContext一定返回的是Activity对象吗?
2019-06-23 22:18 -
每日一问 详细的描述下自定义 View 测量时 MesureSpec.UNSPECIFIED
2019-06-20 00:26

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.键值对不宜过多
有没有 推荐的更优解呢
棒!赞一个~
跨进程可以使用微信的MMKV
能不用就不用
在看到这个提问前,我是一脸懵逼。参考您的评论内容,自己也经过一些源码研究后,下面是一些个人的理解: 1,sp只在创建SharePreferencesImpl实例时,才会将磁盘的文件加载进内存;getX ...查看更多
在看到这个提问前,我是一脸懵逼。参考您的评论内容,自己也经过一些源码研究后,下面是一些个人的理解: 1,sp只在创建SharePreferencesImpl实例时,才会将磁盘的文件加载进内存;getXxx方法之所以能拿到最新的value,是因为在apply/commit时会先将删除,修改,添加的Key,value写入内存,然后才写入磁盘; 2,get操作时,应该是锁定一个Object对象(sdk28源码是这样); 3,跨进程的操作,MODE_MULTI_PROCESS已过时,系统建议使用例如ContentProvider替换该操作; 4,sp只会读取一次,可以在应用初始化的时候创建SpImpl对象;例如json字符串加载进内存,会占用很多的内存空间,理论上GC的频发容易导致卡顿。
另外,我有一个疑问,apply的好处是不是在于:高并发情况下,apply两次,存入内存两次,但数据从内存存入磁盘只需要一次;而commit方法是等前一个完全存入磁盘后,才执行下一个commit方法,这 ...查看更多
另外,我有一个疑问,apply的好处是不是在于:高并发情况下,apply两次,存入内存两次,但数据从内存存入磁盘只需要一次;而commit方法是等前一个完全存入磁盘后,才执行下一个commit方法,这样内存数据存入磁盘就有了两次。因此,apply更优化,这样理解对吗?
所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败
我来说一下安全方面的吧:对于root的手机,对应的xml文件可以导出来,当然也可以修改,敏感信息还是不要用这个存。
从源码、注意事项、和建议三方面详细讲了一下 SharedPreferences
https://www.jianshu.com/p/4025d02a8380https://www.jianshu.com/p/40e42da910e2
学习了
commit和apply的方法区别在于同步写入和异步写入,以及是否需要返回值。
在不需要返回值的情况下,使用apply方法可以极大的提高性能。多个写入操作可以合并为一个commit/apply,将多个写入操作合并后也能提高IO性能。一般量少就用sp,不支持跨进程是个问题,它在内存里面有缓存,跨进程改了卵用都没。
所以一般情况用sp,需要跨进程就用的mmkv
优点,我可以不写代码
SharedPreferences为我们提供了轻量级存储能力,方便了少量数据的持久化。优点自然是简单易用,不过存储类型有限制,只能是字符串型、基本类型的值。
缺点:1.不支持跨进程 2.原生API的限制主要有以下两方面:(1)IO瓶颈 (2)锁性能差 3.对SP的不当封装也会间接造成数据读写性能差。
简单好用啊,一行代码就可以存,可以取。想存啥存啥。
是个app,总要存点东西,这个方便。
至于啥跨进程,没这需求。
卡顿,没发现,感觉挺好的。
方便快捷
缺点 不宜存大数据,容易被清除