顾名思义,Android 开发肯定会使用到SharedPreference。以下简称SP
sp是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。
是以xml文件保到:/data/data/包名/shared_prefs目录下。类似键值对的方式来存储数据。
sp提供了常规的数据类型保存接口比如:int、long、boolean、String、Float、Set和Map这些数据类型。
SharedPreferences sp = SharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE);
//获取Editor对象,这个对象用于写入,可理解为编辑
SharedPreferences.Editor editor = sp.edit();
//Editor对象有几个方法需要注:clear(),commit(),putXXX(),clear()为清空Share文件中的内容,
//commit()为提交,editor在put值以后,需要调用commit方法才能被真正写入到Share文件中
editor.putString("uid", "22222")mit();
//先获取对应的Share
SharedPreferences spSharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE);
//根据key取出对应的值
sp.getString("uid", "");//第二个参数为默认值,即当从Share中取不到时,返回这个值
commit: 有返回值,直接同步提交到硬件磁盘
apply:将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 所以很明显apply的 效率要高一些。
a.创建SharedPreferencesImpl时解析数据,子线程使用Java IO读取整个文件,进行XML解析,并将所有数据存入内存Map集合,其他操作都需要等待初始化完成
b.把Map中的数据,全部序列化为XML,覆盖文件保存
c.不支持多进程
d.调用apply方法异步提交数据
// SharedPreferencesImpl#EditorImpl#apply
public void apply() {...final Runnable awaitCommit = new Runnable(){...}// 将runnable添加进队列中QueuedWork.addFinisher(awaitCommit);...// 通过HandlerThread执行IO操作queueDiskWrite(mcr, postWriteRunnable);...
}
Android是基于消息驱动的,所有代码都是由Handler驱动执行的,Activity生命周期也不例外。
在Activity启动流程中,我们知道Activity生命周期最终会由ActivityThread中的一个Handler发送到主线程执行。其中onStop时执行handleStopActivity。
回调onStop之后,如果QueuedWork中有未完成的任务,则会同步执行其中的任务。
所以,如果任务耗时过长,则可能出现ANR
@Override
public void handleStopActivity(IBinder token, int configChanges,PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) {...// 回调onStopperformStopActivityInner(...); ...// 阻塞等待队列执行完毕QueuedWork.waitToFinish();
}
更高效的文件操作(mmap)
比XML更精简的数据格式(二进制、protobuf)
更优的数据更新方式(增量更新)
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。
注:mmap的关键点是实现了用户空间和内核空间的数据直接交互而省去了空间不同数据不同的繁琐过程
MMAP对文件的读写操作只需要从磁盘到用户主存的一次数据拷贝过程,减少了数据的拷贝次数,提高了文件操作效率
MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP的速度和操作内存的速度一样快
MMAP提供一段可供随时写入的内存块,App只管往里面写数据,由操作系统如内存不足、进程退出等时候负责将内存回写到文件,不必担心Crash导致数据丢失
MMAP是零拷贝的(不需要CPU参与的拷贝),也可理解为一次拷贝(/DMA拷贝)
本文发布于:2024-02-01 15:20:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170677200837548.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |