Adnroid 数据存储 SharedPreferences详解(二):SP的问题、原理分析、替代方案、MMAP

目录

1)SP的问题和源码分析
2)MMAP 和MMKV(简单介绍)

一、SP的问题

1.1 get问题


查看源码,当我们使用getFloat或者其他getInt等get方法的时候,里面会有一个awaitLoadedLocked方法,这个方法是用于等待SharedPreferences数据加载完成的。
在这里插入图片描述
所以如果这个时候我调用getFloat方法,那么当初始化数据量大的时候,就会造成主线程阻塞,启动效率慢,因为要等他加载完成。

具体来说,awaitLoadedLocked()方法会检查SharedPreferences是否已经加载完成,如果加载完成则立即返回;如果尚未加载完成,则会创建一个CountDownLatch对象,并通过该对象进行线程同步,使当前线程进入等待状态,直到数据加载完成后才继续执行。

这样做的目的是为了保证在获取SharedPreferences数据之前,先确保数据已经加载完毕,以避免出现数据不一致或空指针异常等问题。
在这里插入图片描述

1.2 SP的源码分析


(1)首先我们需要追进getSharedPreferences方法去看看
在这里插入图片描述跳到构造函数,可以看到里面有一个ArrayMap,会有一个File,因为SharedPreferences支持创建多个文件,所以ArrayMap分别用来存储这些文件,通过名字,比如上面的是test作为key,file作为value。
在这里插入图片描述(2)SharedPreferences是一个接口,所以我们需要创建一个实现类
在这里插入图片描述接下来我们会跳到实现类里面看看实现的逻辑是怎么样的。这里为什么需要启动一个线程呢?
在这里插入图片描述
他需要在这个线程里面进行数据加载,操作磁盘,因为IO是耗时操作,并且用的是传统的IO操作
在这里插入图片描述
我们可以看到传递进来了一个file,这个文件里面有我们想要操作的数据,所以我们需要使用IO进行数据读取操作,因为是xml文件,所以我们需要用到xml解析方式,将数据解析出来,因为xml是key,value的方式,解析出来的数据使用一个map来进行存储,方便我们进行读取。

(3)后续如果我们需要读取数据,那么就调用getXXX方法,并且加了锁,保证线程的安全问题。
在这里插入图片描述

1.3 总结


特点说明
数据格式XML格式保存
初始化子线程使用传统IO读取整个文件,进行xml解析,再存入内存的Map中
数据读取会等待初始化加载完成,才会进行读取
更新把Map中的数据,全部序列化为XML,覆盖文件,全量写入

所以我们可以看到存在很多缺点,全量数据写入,传统的IO操作,会导致操作文件效率低下,不支持局部更新,阻塞主线程等等,下面我们会讲讲MMAP技术。

二、MMAP 和 MMKV


传统的IO

传统IO是指通过读取或写入字节流来进行文件操作。在传统IO中,需要使用FileInputStream、FileOutputStream等类来打开文件,并通过read()和write()方法来读取和写入数据。这方式涉及到系统调用和用户空间之间的数据拷贝,即将数据从内核缓冲区复制到用户空间或者反过来,因此会产生额外的性能开销。

MMAP

MMAP则是一种基于内存映射的文件访问方式。它通过将文件直接映射到进程的虚拟地址空间,使得应用程序可以像访问内存一样访问文件内容。在MMAP中,我们可以使用FileChannel.map()方法将文件映射为一个MappedByteBuffer对象,然后通过该对象来读取和写入文件数据。由于数据直接映射到内存中,避免了数据拷贝的开销,因此具有更高的性能。

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

MMAP相比传统IO具有更高的性能主要原因有:
1)减少数据拷贝:传IO需要多次数据拷贝,而MMAP直接访问内存,省去了数据拷贝的开销。
2)避免系统调用:传统IO每次读写都需要进行系统调用,而MMAP只需要在映射和解除映射时进行系统调用,减少了系统调用的次数。
3)页面缓存:MMAP利用操作系统的页面缓存机制,可以提供更快的随机访问速度。

而MMKV框架就使用了MMAP,MMKV 是基于 mmap 内存映射的 key-value 组件,将数据直接映射到存中,避免了数据拷贝和系统调用的开销,因此具有较高的读写性能。相比于传统的SharedPreferences和SQLite,MMKV在性能和功能上都有明显的优势。它适用于需要频繁读写大量数据的场景,例如缓存管理、配置信息存储等。同时,由于其跨平台的特性,MMKV可以在Android和iOS等多个平台上使用,方便实现数据共享和迁移。

在这里插入图片描述
上图,可以看到两者的速度基本一致。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前期后期

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

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

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

打赏作者

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

抵扣说明:

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

余额充值