当前位置: 首页 > news >正文

源码:SharedPreferences分析

一、持久化方式:

  • DataStore:稳定性

  • MMKV:效率

  • SharedPreferneces

区别:

功能MMKVJetpack DataStoreSharedPreferneces
是否阻塞主线程
是否线程安全是                是                
是否支持跨进程
是否类型安全
是否支持protocol buffers
是否能监听数据变化

二、SharedPreferences存储流程:

  1. k,v -> 存储到文件里

  2. 序列化:XML JSON PROTOBUFF…

  3. IO

三、SP的系统源码分析--调用流程

getSharedPreferences("test",MODE_PRIVATE)

  1. Context#getSharedPreferences --> Context的实现类 --ContextImpl#getSharedPreferences中去new SharedPreferencesImpl对象 ContextWrapper 用到装饰者模式

  2. SharedPreferencesImpl#startLoadFromDisk(),用一个同步代码块synchronized 将 mLoaded = false; (mLoaded -> 加载是否完成)

  3. 同时启动一个子线程去进行IO操作,子线程中调用loadFromDisk,去进行数据的加载 str = new BufferedInputStream(new FileInputStream(mFile), 16 * 1024) IO体系 用到装饰者模式

  4. 读数据:读出来之后加载到内存中,放到一个全局的HashMap变量mMap -- 因此SP读取数据的效率是非常高的

  5. 取数据:

  6. 每次取数据都会调用一下edit方法,内部都会new EditorImpl

  7. 得到edit之后,调用put()保存,将k v数据放到临时的map集合里mM

  8. 保存完了之后调用commit,apply

  9. commit:boolean 同步 当CPU忙,达到峰值,数据大,会产生ANR

  10. apply: void 异步 也会产生ANR

注意:

        在使用SP的时候,不要频繁的调用edit,如在for循环里、view#onDraw,gc频繁运行,可能会导致程序卡顿,如果GC选择的回收对象算法是标记清除算法,可能导致程序出现OOM导致内存碎片的产生。

分析:

        Apply异步产生ANR的原因 -- Activity跳转时,apply提交会包装成Runnable:任务 -> QueuedWork:队列 排队执行 ->会执行QueuedWork.waitToFinish:等待QueuedWork中的任务全部执行完

        AActivity ->BActivity

        A:onPause -> B:onCreate onStart onResume -> A:onStop

疑问:

        生命周期是怎么被调起的?/ Activity启动流程

        AMS -> Binder -> ActivityThread#ApplicationThread->对应的方法 -> handler -> 调用

总结:

特点

说明

数据格式

XML格式保存

初始化

子线程使用IO读取整个文件,进行XML解析,存入内存Map集合

保存

commit同步提交,阻塞主线程;apply异步提交,无法获取结果且可能数据丢失

更新

把Map中的数据,全部序列化为XML,覆盖文件保存(全量更新

优化方向:

  • 比XML更精简的数据格式,XML繁琐,冗余数据多,数据量大

  • 高效的文件操作 -- 传统IO 高效的NIO(零拷贝) FileChannel,transformTO

  • 更优的数据更新方式 -- 局部更新

http://www.lryc.cn/news/63546.html

相关文章:

  • 大二一个学期学这么点内容,没有概念,只有实操
  • AppWeb 身份验证绕过漏洞 (CVE-2018-8715)
  • 为什么监控摄像头画面不如手机拍摄视频画面清晰
  • EU GMP附录一与关键区域空气微生物取样方案及相关法规标准解读
  • 【软件测试】自动化测试日志问题该怎么解决?测试老鸟总结方案...
  • 快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会
  • MySQL数据库——MySQL DELETE:删除数据
  • 管家婆安装导致电脑蓝屏问题解决方案
  • Compiler Lab1- 自制词法分析器
  • 构建API的战斗——与来自Kong的Marco Palladino的问答
  • 华为OD机试 - 对称美学(Python)
  • argparse.ArgumentParser
  • 大数据Doris(五):FE 扩缩容
  • react相关概念
  • 计算机的硬件系统的组成
  • Python基础-列表元组
  • 【校招VIP】拿到offer就躺平?转正前需要知道的这些事儿...
  • 考研拓展:汇编基础
  • 10 【Sass语法介绍-继承】
  • 魔兽worldserver.conf 服务端配置文件说明
  • 关于电信设备进网许可制度若干改革举措的通告
  • TuGraph 开源数据库体验
  • 【C++】18.哈希
  • C# 利用TabControl控件制作多窗口切换
  • 论文阅读《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID》
  • SOA与中间件、基础件的发展
  • 渗透测试 | 目录扫描
  • 基于Springboot的班级综合测评管理系统的设计与实现
  • 比较全的颜色RGB值对应表 8位 16位
  • freertos使用基础