SharedPreferences

SharedPreferencespublic interface SharedPreferences android.content.SharedPreferencesInterface for accessing and modifying preference data returned by getSharedPreferences(String, int). For any particular set of preferences, there is a single instance of this class that all clients share. Modifications to the preferences must go through an SharedPreferences.Editor object to ensure the preference values remain in a consistent state and control when they are committed to storage. Objects that are returned from the various get methods must be treated as immutable by the application.Note: This class does not support use across multiple processes.

看完官方的解释实在是心疼我自己好多秒………..

上面的意思是:
接口,用于访问和修改由返回偏好数据getSharedPreferences(String, int)。对于任何特定的偏好,有这个类,所有客户端共享的单个实例。修改偏好必须经过一个SharedPreferences.Editor对象,以确保优先值保持一致的状态和控制时,他们都致力于存储。个从各个返回的对象get的方法必须由应用程序被视为不可变的。

注意:此类不支持跨多个过程中使用。

哇,扎心….

在使用SharedPreference 时,有一些模式:MODE_PRIVATE 私有模式,这是最常见的模式,一般情况下都使用该模式。 MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE ,文件开放读写权限,不安全,已经被废弃了,google建议使用FileProvider共享文件。MODE_MULTI_PROCESS,跨进程模式,如果项目有多个进程使用同一个Preference,需要使用该模式,但是也已经废弃了。
官方也做了解释: Android不保证该模式总是能正确的工作,建议使用ContentProvider替代。

还有因为MODE_MULTI_PROCESS 是跨进程的,在你存储数据的时候有可能两个进程数据不同步,而且如果数据过大时,跨进程模式的流程是先load数据进行比较,如果不同的话就会重新获取大大降低了内存缓存的作用,文件读写耗时也影响了性能。

上一篇讲到了android:process属性的问题,如果你在主进程里面存储了一个数据,在另外一个加了android:process属性的activity或者其他组件下进行了数据更新,这样跨进程的更新就会失败,从而出现数据没有更新的情况。

其实如果真的要采取跨进程缓存数据,官方推荐的是采用四大组件的contentProvider

其实出现这样的问题,可以采取一个原则:确保一个文件只有一个进程在读写操作

总结:

  1. 不要存放大的key和value!会引起界面卡、频繁GC、占用内存等等!
  2. 毫不相关的配置项就不要丢在一起了!文件越大读取越慢,可以多存几个
  3. 读取频繁的key和不易变动的key尽量不要放在一起,影响速度。
  4. 不要乱edit和apply,尽量批量修改一次提交!
  5. 尽量不要存放JSON和HTML!
  6. 不要用这东西进行跨进程操作!!!

更多相关文章

  1. Android曲线图,柱状图,饼图
  2. 寒假练习一
  3. Android(安卓)Retrofit2网路编程实现方法详解
  4. Activity的基本理解
  5. Android中SharedPreference多进程数据共享出错
  6. Android标题栏随滑动渐变效果的实现
  7. android assets文件夹下的数据库应用
  8. 视频聊天软件源码Android(安卓)8.1user版本默认开启开发者模式
  9. Android代码优化----PullToRefresh+universal-image-loader实现

随机推荐

  1. 订单模块数据库表解析(一)
  2. 营销模块数据库表解析:首页内容推荐功能
  3. 订单模块数据库表解析(二)
  4. Hutool中那些常用的工具类和方法
  5. 从零开始学TensorFlow【什么是TensorFlow
  6. 【社区观察】未来Python2.7会收费?
  7. SpringCloud整体架构概览
  8. Postman:API接口调试利器
  9. 订单模块数据库表解析(三)
  10. Python社区软件包概况分析