根据Context获取SharedPreferences对象
利用edit()方法获取Editor对象。
通过Editor对象存储key-value键值对数据。
通过apply()或者commit()方法提交数据。
SharedPreferences.Editorapi:完成数据写入操作
SharedPreferencesapi:完成数据读取操作
commit()方法与apply()方法的比较
二者都是提交preference修改数据
二者都是原子过程。
apply没有返回值而commit返回boolean表明修改是否提交成功
apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘;而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
apply方法不会提示任何失败的提示。
对api的理解
1.commit介绍:publicabstractbooleancommit()
修改你的preferences,从Editor到SharePreferences。它执行所请求的修改,替代SharedPreferences中的任何数据,当2个editor同时修改preferences,最后一个commit成功。如果不关注返回值或在程序的main线程使用时,推荐使用apply().
2.apply介绍:publicabstractvoidapply()
区别:commit将同步的将数据写到preferences;apply立即更改内存中的SharedPreferences,但是开始异步提交到磁盘中。保存失败你也不会得到任何提示信息,如果在这个sharedPreferences有另外一个editor执行一个定期的commit,此时一个apply依旧未完成。commit将被阻塞,直到所有异步操作完成,以及自己的commit。由于SharedPreferences在进程中是单实例的。在忽悠返回值的前提下,取代任何实例的commit或apply都是安全的。
如果你希望传入的Set是一个有序的(跟插入时的顺序一样),那么使用LinkedHashSet<String>类型,构造好一个LinkedHashSet<String>对象之后,调用SharedPreferences.Editor的putStringSet(Stringkey,Set<String>values)写入。按照常规的思维,通过SharedPreferences的getStringSet(Stringkey)方法读取出来数据,然后强制转为LinkedHashLinked<String>,可是出现异常了,系统提示不能将HashSet<String>转为LinkedHashSet<String>类型。也就是说取出来的值已经不再是我们写入的类型了。所以就只能使用HashSet<String>默认的排序类型,这只能满足那些不关系顺序的情况。
四、SharedPreferences一次存入多个有序数据解决方案(String类型为例)——使用字符串拼接(StringBuilder)的方式
public voidtestSharedPreferences(Context context) { // 写数据操作 final String regularExpression = "#"; final String key = "key"; final String[] strings = { "1111", "2222", "3333"}; final String defaultValue = "5555"; final String fileName = "filename"; final StringBuilder stringBuilder = newStringBuilder(); for (int i = 0; i < strings.length; i++) { stringBuilder.append(strings[i]); if (i != strings.length - 1) { stringBuilder.append(regularExpression); } } SharedPreferences preferencesWrite = context.getSharedPreferences(fileName, Context.MODE_WORLD_READABLE); SharedPreferences.Editor editor = preferencesWrite.edit(); editor.putString(key, stringBuilder.toString()); editor.apply(); // 读数据操作 SharedPreferences preferencesRead =context.getSharedPreferences(fileName, Context.MODE_WORLD_READABLE); final String resultStr = preferencesRead.getString(key, defaultValue); // 没有对应的key则返回“5555” final String[] resultArray = resultStr.split(regularExpression); // 解析数据,字符串分割 for(String str : resultArray) { System.out.println(str); } }
五、SharedPreferences多进程支持(虽然支持,但是还是不靠谱的,大量同时读写操作也会存在问题)
public static intgetMode() { //MODE_MULTI_PROCESS is always on in apps targeting Gingerbread //(Android 2.3) and below, and off by default in later versions return Build.VERSION.SDK_INT > 8 ? 4 : 0; } public voidtest() { SharedPreferences settings = context.getSharedPreferences("fileName", getMode()); }
下面是getSharedPreferences方法的定义和解释:
publicabstractSharedPreferencesgetSharedPreferences(Stringname,intmode)
Retrieveandholdthecontentsofthepreferencesfile'name',returningaSharedPreferencesthroughwhichyoucanretrieveandmodifyitsvalues.OnlyoneinstanceoftheSharedPreferencesobjectisreturnedtoanycallersforthesamename,meaningtheywillseeeachother'seditsassoonastheyaremade.