SharedPreference进阶MMKV框架

2023-12-23 20:40

本文主要是介绍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) {...// 回调onStopperformStopActivityInner(...);         ...// 阻塞等待队列执行完毕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拷贝)

这篇关于SharedPreference进阶MMKV框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529387

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1