SharedPreferences
进程取值问题
假设有两个进程A,B
- A获取SP对象,B获取SP对象,A中SP无论怎么修改,B中SP均不会被改变;
- A获取SP对象,修改了值,B获取SP对象,B中的SP值为获取时的最后的值,也就是A修改了之后的值;后续A的SP的任何改变,均不会影响B的SP;
- SP的模式设置为MODE_MULTI_PROCESS,在Android 3.0以上也不行;
apply和commit区别
- apply会将写入磁盘的任务加入到一个线程池中在后台运行;
- commit则会在当前线程进行写入;
使用建议
- 不要存放过大的key,value在SP中,会导致内存使用过大,内存使用过高会频发引发GC,导致界面丢帧甚至ANR。
- 合理安排一个SP内存放的数据,单个文件越大则读取数独越慢。
- 登录信息和其他的sp可以分开放。
- 频繁读取的key和不频繁的key可以分开放
- apply的使用也不是一定不会出问题,如果它虽然是在线程池进行的,如果在关闭Activity的时候,handleStopActivity中判断apply的操作还未做完,则有可能因为时间过长导致ANR;
- 提前初始化 SharedPreferences,避免第一次读取时间问题。
延伸
- 采用上述的形式进行数据存储与读取,主要还是为了防止频繁的IO读取磁盘带来的性能开销,如果实时从磁盘读取,性能上面肯定有不可忽视的影响。
- 如果对存储的成功与否的结果并不关心的话,可选择性的使用apply。因为apply方法是在线程池进行文件的写入,而commit方法则是直接在当前线程进行文件的写入的。
- 多进程的数据共享推荐使用ContentProvider。(MODE_MULTI_PROCESS在3.0以上已经被弃用了)