SharePreference 优化建议

本文探讨了SharedPreferences的使用优化,包括避免存储大数据、分文件管理配置、减少edit操作、合理选择commit或apply、避免存储复杂数据类型,并分享了解决初始化慢和跨进程通信问题的实践方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、不要存放大的 key 或 value 在 SharedPreferences 中,否则会一直存储在内存中(Map 容器中)得不到释放,内存使用过高会频繁引发 GC,导致界面丢帧甚至 ANR

2、不相关的配置选项最好不要放在一起,单个文件越大加载时间越长。(参照 SharedPreferences 初始化时会开启异步线程读取对应文件,如果此时耗时较长,当对其进行相关数据操作时会导致线程等待)

3、读取频繁的 key 和 不频繁的 key 尽量不要放在一起。(如果整个文件本身就较小则可以忽略)

4、不要每次都 edit 操作,每次 edit 都会创建新的 EditorImpl 对象,最好批量处理统一提交。否则每次 edit().commit() 都会创建新的 EditorImpl 对象并进行一次 I/O 操作,严重影响性能。

5、commit 提交发生在 UI 线程,apply 提交发生在工作线程,对于数据的提交最好是批量操作统一提交。虽然 apply 任务发生在工作线程(不会因为 I/O 阻塞 UI 线程),但是如果添加过多任务也有可能带来其它”严重后果“(参照系统源码 ActivityThread - handlePauseActivity 方法实现)

6、尽量不要存放 JSON 或 HTML 类型数据,这种可以直接文件存储

7、最好能够提前初始化 SharedPreferences,避免 SharedPreferences 第一次创建时读取文件内容线程未结束而出现的等待情况,参照优化点第 2 条

8、不要指望它能够跨进程通信:Context.MODE_MULTI_PROCESS

实际项目中: 当前项目中很多业务一些状态的持久化都保存在了一个Preference中,其中定义了100个Key,几乎所有的业务持久化都保存在其中了

存在的问题:

1 长期下来,会导致Preference过大,其初始化时间过长

2 如果业务模块需要持久化一些状态,尽量使用只和自身业务相关的Preference 

 解决方式:

1 拆分出几个独立的Preference(用户信息和登录状态相关,阅读任务相关的,app设置相关的,app 配置相关的(比如 图片host 配置等)

2 修改读取方式,由 commonPreference ---> businessPreference

3 进行数据库升级,然后将commonPreference中的状态 迁移到 businessPreference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值