SharedPreference进阶MMKV框架

SharedPreference 简介

顾名思义,Android 开发肯定会使用到SharedPreference。以下简称SP

sp是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。

是以xml文件保到:/data/data/包名/shared_prefs目录下。类似键值对的方式来存储数据。

sp提供了常规的数据类型保存接口比如:int、long、boolean、String、Float、Set和Map这些数据类型。

1.sp存储

SharedPreferences sp = context.getSharedPreferences(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").commit();

2.sp读取

//先获取对应的Share
SharedPreferences sp=context.getSharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE);
//根据key取出对应的值
sp.getString("uid", "");//第二个参数为默认值,即当从Share中取不到时,返回这个值

3.commit于apply的区别

commit: 有返回值,直接同步提交到硬件磁盘

apply:将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 所以很明显apply的 效率要高一些。

4.弊端

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操作
    SharedPreferencesImpl.this.enqueueDiskWrite(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) {
   ...
   // 回调onStop
   performStopActivityInner(...);         
   ...
   // 阻塞等待队列执行完毕
   QueuedWork.waitToFinish();
}

MMKV 介绍

  1. 更高效的文件操作(mmap)

  2. 比XML更精简的数据格式(二进制、protobuf)

  3. 更优的数据更新方式(增量更新)

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强

mmap(memory mapping 内存映射)

原理

Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。

 

  1. 对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系
  2. 实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上

注:mmap的关键点是实现了用户空间和内核空间的数据直接交互而省去了空间不同数据不同的繁琐过程

优势

  • MMAP对文件的读写操作只需要从磁盘到用户主存的一次数据拷贝过程,减少了数据的拷贝次数,提高了文件操作效率

  • MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP的速度和操作内存的速度一样快

  • MMAP提供一段可供随时写入的内存块,App只管往里面写数据,由操作系统如内存不足、进程退出等时候负责将内存回写到文件,不必担心Crash导致数据丢失

MMAP是零拷贝的(不需要CPU参与的拷贝),也可理解为一次拷贝(/DMA拷贝)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又双㕛叕、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值