再见SharedPreferences,你好MMKV!

2023-10-08 06:18

本文主要是介绍再见SharedPreferences,你好MMKV!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

SharedPreferences是谷歌提供的轻量级存储方案,使用起来比较方便,可以直接进行数据存储,不必另起线程。

不过也带来很多问题,尤其是由SP引起的ANR问题,非常常见。

正因如此,后来也出现了一些SP的替代解决方案,比如MMKV。

本文主要包括以下内容

  1. SharedPreferences存在的问题
  2. MMKV的基本使用与介绍
  3. MMKV的原理

SharedPreferences存在的问题

SP的效率比较低

  1. 读写方式:直接I/O
  2. 数据格式:xml
  3. 写入方式:全量更新

由于SP使用的xml格式保存数据,所以每次更新数据只能全量替换更新数据。

这意味着如果我们有100个数据,如果只更新一项数据,也需要将所有数据转化成xml格式,然后再通过io写入文件中。

这也导致SP的写入效率比较低。

commit导致的ANR

public boolean commit() {
    // 在当前线程将数据保存到mMap中
    MemoryCommitResult mcr = commitToMemory();
    SharedPreferencesImpl.this.enqueueDiskWrite(mcr, null);
    try {
        // 如果是在singleThreadPool中执行写入操作,通过await()暂停主线程,直到写入操作完成。
        // commit的同步性就是通过这里完成的。
        mcr.writtenToDiskLatch.await();
    } catch (InterruptedException e) {
        return false;
    }
    /*
     * 回调的时机:
     * 1. commit是在内存和硬盘操作均结束时回调
     * 2. apply是内存操作结束时就进行回调
     */
    notifyListeners(mcr);
    return mcr.writeToDiskResult;
}

如上所示

  1. commit有返回值,表示修改是否提交成功。
  2. commit提交是同步的,直到磁盘操作成功后才会完成。

所以当数据量比较大时,使用commit很可能引起ANR。

Apply导致的ANR

commit是同步的,同时SP也提供了异步的apply。

apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。

而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这

这篇关于再见SharedPreferences,你好MMKV!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

数据存储之SharedPreferences

1. 概述 SharedPreferences是最简单的一种数据存储方式,但其局限性在于,只能保存key-value类型、并且只能是简单的数据类型。 2. 使用方法&示例 2.1 代码 @Overrideprotected void onResume() {super.onResume();getPreferences();}private void getPreferen

SharedPreferences存储 list map

1通过SharedPreferences将List<Map<String, String>>进行存储 保存数据 public void saveInfo(Context context, String key, List<Map<String, String>> datas) {JSONArray mJsonArray = new JSONArray();for (int i = 0; i <

2014年总结,2015年你好!

2014年就这么转瞬的离去,估计是自己越来越成熟了吧。感觉现在时间过得越来越快!平时也总是提醒自己,多总结,提效率,有目标,戒懒惰!但真正都做到并不是这么容易的。 回望2014年,第一次有本命年的概念的一年,自己经历的太多,承担的也太多,成熟很多,对自己的意志力,勇气,心态,胸怀等都有很大提升! 一学习方面,除了强化python语言编程,接触JAVA编程。读了四本书,《做最好的自己》、《图穷变

SharedPreferences的四种模式

开发应用需要保存一些配置参数,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。如果是Android应用,我们最适合采用SharedPreferences保存数据,它是一个轻量级的存储类,特别适合用于保存软件配置参数。 有两种方法可以获得SharedPreferences对象: getSharedPreferen

SharedPreferences与Properties对比

1、SharedPreferences,五大存储方式中最简单的一种,属于键值对形式的,JAVA的util包中中还有个Properties,也是键值对形式的,同样用于存储。现在把  SharedPreferences与Properties做一个简单对比!!! 1.1、从类的高度来看 Properties是继承了HashTable,是一个Map集合,存储的属性集都是字符串类型的,所以不需要泛型

安卓多进程sharedpreferences数据不同步的问题

获取SharedPreferences的两种方式: Context 中 getSharedPreferences方法:     public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);     public abstract SharedPreferences g

【读书笔记】第1章 你好,C++并发世界

1.1 什么是并发(concurrency) 并发是指两个或更多独立的活动同时发生。 1.1.1 计算机系统中的并发 大多数计算机只有一个处理器,具有单个处理单元(processing unit)或核心(core),如今还有很多这样的台式机。通过“这个任务做一会,再切换到别的任务,再做一会儿”的方式,让任务看起来是并行执行的。这种方式称为“任务切换(task switching)”。如今,我

SharedPreferences工具类(2种)

下载地址  点击打开链接 -----------------------------------------------------------------首先看方法1------------------------------------------------------------------------------ SharedPreferencesUtils1

从零开始,认识游戏设计师(1)你好,未来的游戏制作人

前言 本博客主要参考游戏设计艺术,将带着大家一起对这本书进行一个精细地解读以及分析,虽然博主也热衷于编程,但是策划才是博主真正的归属。 本栏的主旨固然可以让你成为更好的游戏开发者,但是其实我更多想要让大家能从我的角度去重新审视游戏设计,去从本初的角度看待一款游戏。 本专栏更多会从游戏设计(策划)角度去进行讲解,去挖掘独属于游戏设计的深处内容。 游戏设计是什么? 这个问题,恐怕我们要谈很久