Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

mmkv数据互通的问题

Open zzx752904457 opened this issue 2 years ago • 6 comments

SP因为每次都是IO操作,所以能取到同一份值,但是MMKV是内存映射,插件和宿主中的内存不是同一份,导致宿主中MMKV值更新了,但是插件中的MMKV获取到的值还是老的。这个有什么解决方法吗

zzx752904457 avatar May 26 '22 08:05 zzx752904457

MMKV是内存映射,插件和宿主中的内存不是同一份

用代码表达一下吧。

shifujun avatar May 26 '22 09:05 shifujun

就可以看成是底层依赖中的一个单例对象,在插件和宿主中都会实例化。如果在宿主中的某个业务update了该单例对象的数据,那么也只会更新宿主中的数据,插件中的单例对象数据并没有更新。

zzx752904457 avatar May 26 '22 09:05 zzx752904457

这种内存数据共享的问题,难道都只能从本地文件里取吗?针对插件化里有没有什么好的处理方式

zzx752904457 avatar May 26 '22 09:05 zzx752904457

即便是一个Class实例化的两个Object,凭什么修改其中一个另一个就会自动同步变化?

如果你在插件和宿主中各自打包了一份这个Class,它们在运行时就是两个Class了, 其各自实现的单例模式也会各自维护一个实例对象,所以还是两个Object。

看起来你只是需要让插件不要自己打包这个Class,直接依赖宿主中的Class就可以了。

可以参考sample中的这个包中代码: https://github.com/Tencent/Shadow/blob/9f1d8b2d0bedef6a5234e835c52fbf8ecc0eadda/projects/sample/source/sample-plugin/sample-app/build.gradle#L119

shifujun avatar May 26 '22 09:05 shifujun

我记得mmkv是支持多进程访问的 可以试试这个方法

String dir = getFilesDir().getAbsolutePath() + "/mmkv_multiprocess1";
String rootDir = MMKV.initialize(this, dir);
MMKV kv = MMKV.mmkvWit

https://github.com/Tencent/MMKV/issues/838

e9ab98e991ab avatar Jun 16 '22 08:06 e9ab98e991ab

即便是一个Class实例化的两个Object,凭什么修改其中一个另一个就会自动同步变化?

如果你在插件和宿主中各自打包了一份这个Class,它们在运行时就是两个Class了, 其各自实现的单例模式也会各自维护一个实例对象,所以还是两个Object。

看起来你只是需要让插件不要自己打包这个Class,直接依赖宿主中的Class就可以了。

可以参考sample中的这个包中代码:

https://github.com/Tencent/Shadow/blob/9f1d8b2d0bedef6a5234e835c52fbf8ecc0eadda/projects/sample/source/sample-plugin/sample-app/build.gradle#L119

请问,那么如何让插件代码使用宿主的so库呢

mm46468648 avatar Mar 24 '23 07:03 mm46468648