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 Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4