SharedPreferences
SharedPreferences
public interface SharedPreferences
android.content.SharedPreferences
Interface 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
其实出现这样的问题,可以采取一个原则:确保一个文件只有一个进程在读写操作
总结:
- 不要存放大的key和value!会引起界面卡、频繁GC、占用内存等等!
- 毫不相关的配置项就不要丢在一起了!文件越大读取越慢,可以多存几个
- 读取频繁的key和不易变动的key尽量不要放在一起,影响速度。
- 不要乱edit和apply,尽量批量修改一次提交!
- 尽量不要存放JSON和HTML!
- 不要用这东西进行跨进程操作!!!