sharedpreferences存储位置,Android如何关闭别的线程
一. SharedPreferences简介
Android的SharedPreferences (以后称为SP )是一种轻量级数据存储方法,可以存储简单的数据类型,如字符串、整型和布尔值。 应用场合主要是数据少的配置信息。 内部以XML结构保存在/data/data/包名称/shared_prefs文件夹下,数据保存为键值对。
使用Preference访问数据并将其用于SP接口和SP的内部接口SharedPreferences.Editor。 这些接口位于android.content包中。
调用context.getsharedpreferences (string name,int mode )方法获取SP接口。 此方法的第一个参数是文件名,第二个参数是操作模式。 有三种操作模式: MODE_PRIVATE (专用)、MODE_WORLD_READABLE (可写入)和MODE_WORLD_WRITEABLE (可写入)。
SP提供了获取getstring (字符串密钥,字符串默认值)、getint (字符串密钥,插入默认值)等数据的方法。 SP的edit ) )方法返回到SharedPreferences.Editor内部界面。 此接口提供了一种存储数据的方法,如putstring(stringkey,String value )、putint (string key,int value )等
二. SP性能优化要点
SP性能下降的原因有很多。
1、本机API限制
)1) IO瓶颈
IO瓶颈导致SP性能下降是最大的原因,IO瓶颈得到解决,80%的性能问题得到解决。
SP的I/o瓶颈有两种:从内存读取数据和向磁盘写入数据。
将数据导入内存将触发以下两个场景:
如果SP文件未加载到内存中,则调用getSharedPreferences方法将初始化该文件并将其读取到内存中。 如果版本比android_H旧,或者使用了MULTI_PROCESS标志,则在每次调用getSharedPreferences方法时都会读取。
我们可以优化的是(2)。 每次在内存中加载数据对效率影响太大了。
h以下的版本残存率较低,几乎可以忽略。
在MULTI_PROCESS的情况下,可以采用其他方式,例如ContentProvider,其效率高,可以避免SP的数据丢失。
将数据写入磁盘包括以下两个场景:
编辑器的提交方法。 每次执行时同步写入磁盘。 每次执行时,editor apply方法都会向单线程池添加写磁盘Task,然后异步写入。
commit和apply方法的区别在于同步写入和异步写入以及是否需要返回值。
如果不需要返回值,使用apply方法可以大大提高性能。
同时,可以将多个写入合并到单个commit/apply中,从而可以通过组合多个写入来提高I/o性能。
)2)锁定性能差
SP的获取操作会锁定SharedPreferences对象,并以独占方式执行其他操作。
SP的put操作、getEditor和commitToMemory锁定SharedPreferences对象,put操作锁定Editor对象,写入磁盘锁定写入锁定。
由于锁定,如果同时执行SP操作,则只会花费一些时间。 缩短锁定时间是另一个优化点。
由于所有读/写操作都是对SP实例对象进行的锁定,因此将数据拆分为不同的SP文件是减少锁定所需时间的直接方法。
通过降低对单个文件的访问频率,使对多个文件的访问均匀分布,从而缩短锁定时间。
在开发机上进行了简单的性能测试(写入全部使用apply,使用commit的话多线程化会花费时间) :
读写同一文件,每10个线程读写10次数据:
需要80-130ms
读写10个文件,每个文件在一个线程上读写10次数据:
需要30-70ms
2、对SP的不当封装间接导致数据读写性能差。
由于我们的项目采用了插件化,因此对SP的操作涉及进程间访问。
使用ContentProvider方案支持进程间访问,并应用ContentProvider访问所有SP操作。
随着项目的增长,通过ContentProvider进行访问所带来的耗时性能也是一个问题。
在ContentProvider中测试SP所需的时间约为直接操作SP所需的时间的4倍。
因此,最近的项目对SP进行了处理,针对不需要穿越过程的SP操作删除了ContentProvider,从而最大限度地减少了浪费的时间。
三. SP优化建议
1、不直接调用SharedPreferences进行读写操作。
如果直接调用getsharedpreferences(fileName,mode ).edit (.putstring ) key,value ),则对数据的操作会直接与filename和key结合,之后再进行
请考虑按以下方式封装。
公共语音保存用户
getsharedpreferences(filename,mode ).edit ) ).putstring )“user_id”,value );
}
这样可以直接访问数据,断开fileName与key的连接,便于后续的拆分和调整。
2、将SP作为耗时的操作处理,尽量减少不必要的呼叫。
例如,以下代码只需要SP读一次即可。
if(sp.getuserid ) )0) {
int id=sp.getUserId (;
.
(五)其他程序访问本程序的配置数据方式
在SharedPreferences中创建的配置文件不需要指定路径和文件扩展名。 读取时也是如此。 通常,配置只能在此APP应用中使用。 这里介绍了一些其他程序希望使用此APP应用程序配置的小知识点。 我应该如何使用SharedPreferences呢? 如下所示。
contextotherappcontext=createpackagecontext (com .奋斗之铃. appdisplaycontrol ),context.context _ ignore _ security )
sharedpreferencessharedpreferences=other appcontext.getsharedpreferences (' preferences ',context.mode_world_readd )
注意:必须添加Context.MODE_MULTI_PROCESS属性。 否则,会出现其他程序读取数据时不会更新的问题。