面试官:MMKV 可以跨进程使用吗?

265 阅读2分钟

在Android开发中,大家对MMKV的使用都比较熟悉,但是大家对它的理解大多都停留在“SharedPrefered的替代品”这个层面,作为App内本地存储持久化的框架。那么有没有想过,在多进程使用中,它是否存在一些问题? 这个也是面试官常问的问题,通过这个问题就可以快速看出你是否了解MMKV,今天我们就来好好讨论一下这个问题

首先MMKV在性能上要远远高于SP,这也是各大公司使用的原因,以下是官方文档及数据对比: MMKV官方文档

APP中的跨进程使用

当一个app存在多进程通信的需要时,可以直接通过MMKV来实现数据跨进程读写。

初始化MMKV

在每个进程的Application类中调用MMKV.initialize()方法来初始化MMKV。确保每个进程都有自己独立的MMKV实例。

CRUD

在每个进程中创建MMKV实例时,使用相同的名称来标识MMKV实例,这样不同进程中的MMKV实例可以互相访问存储的数据。可以通过MMKV.mmkvWithID()方法来创建或获取MMKV实例。

String mmkvID = "my_mmkv";  // 指定MMKV实例的名称
MMKV mmkv = MMKV.mmkvWithID(mmkvID);

这样就可以在不同进程中MMKV实例来进行数据的读写操作。使用MMKV的encodeXXX()方法存储数据,使用decodeXXX()方法读取数据。

Lotus插件化使用

插件化方案中,插件和宿主处于不同APP中,使用MMKV时需要考虑到Android文件的读写权限问题。

初始化MMKV

不仅仅需要确保每个进程都调用到MMKV.initialize(ctx,rootDir),还需要确定指定的rootDir宿主和插件都能访问。

CRUD

在每个进程中创建MMKV实例时,除了使用相同的名称来标识MMKV实例和指定的MMKV.MULTI_PROCESS_MODE,还需要确定指定的rootPath宿主和插件都能访问。

PROCESS MODE

如果设置MMKV.SINGLE_PROCESS_MODE ,在Lotus 插件 化中使用。当宿主和插件同时操作MMKV的数据时,会出现前一个获取到对应的锁之后,后一个获取的就无法再进行操作。

以获取int数据为例

  • java端调用

  • c++端调用