阅读 84

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属性。 否则,会出现其他程序读取数据时不会更新的问题。


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐