中铁建设集团集采网站,株洲做网站优化,阿里云可以建网站吗,八戒网站建设一、持久化方式#xff1a; DataStore#xff1a;稳定性 MMKV#xff1a;效率 SharedPreferneces
区别#xff1a;
功能MMKVJetpack DataStoreSharedPreferneces是否阻塞主线程否否是是否线程安全是 是 是是否支持跨进程是否否是否类型…一、持久化方式 DataStore稳定性 MMKV效率 SharedPreferneces
区别
功能MMKVJetpack DataStoreSharedPreferneces是否阻塞主线程否否是是否线程安全是 是 是是否支持跨进程是否否是否类型安全否是否是否支持protocol buffers是是否是否能监听数据变化否是是
二、SharedPreferences存储流程 k,v - 存储到文件里 序列化XML JSON PROTOBUFF… IO
三、SP的系统源码分析--调用流程
getSharedPreferences(test,MODE_PRIVATE) Context#getSharedPreferences -- Context的实现类 --ContextImpl#getSharedPreferences中去new SharedPreferencesImpl对象 ContextWrapper 用到装饰者模式 SharedPreferencesImpl#startLoadFromDisk()用一个同步代码块synchronized 将 mLoaded false; mLoaded - 加载是否完成 同时启动一个子线程去进行IO操作子线程中调用loadFromDisk去进行数据的加载 str new BufferedInputStream(new FileInputStream(mFile), 16 * 1024) IO体系 用到装饰者模式 读数据读出来之后加载到内存中放到一个全局的HashMap变量mMap -- 因此SP读取数据的效率是非常高的 取数据 每次取数据都会调用一下edit方法内部都会new EditorImpl 得到edit之后调用put()保存将k v数据放到临时的map集合里mM 保存完了之后调用commitapply commitboolean 同步 当CPU忙达到峰值数据大会产生ANR apply: void 异步 也会产生ANR
注意 在使用SP的时候不要频繁的调用edit如在for循环里、view#onDrawgc频繁运行可能会导致程序卡顿如果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 更优的数据更新方式 -- 局部更新