mmkv以及sp的使用以及比较

本文对比了MMKV和SharedPreferences在Android开发中的使用,详细介绍了MMKV的初始化、实例获取、CURD操作及数据迁移,并分析了SP可能导致ANR的原因,如全量写入、XML格式性能弱等。MMKV优点包括protobuf序列化、内存映射文件、增量更新,能更好地解决SP的痛点。
摘要由CSDN通过智能技术生成

开局一张图先看下两者的对比:

mmkv的使用:

1.在 App 模块的 build.gradle 文件里添加:

dependencies {
    implementation 'com.tencent:mmkv:1.0.22'
    // replace "1.0.22" with any available version
}

2.初始化

// 设置初始化的根目录
String dir = getFilesDir().getAbsolutePath() + "/mmkv_2";
String rootDir = MMKV.initialize(dir);
Log.i("MMKV", "mmkv root: " + rootDir);

3.单进程多进程获取实例

// 获取默认的全局实例
MMKV kv = MMKV.defaultMMKV();

// 根据业务区别存储, 附带一个自己的 ID
MMKV kv = MMKV.mmkvWithID("MyID");

// 多进程同步支持
MMKV kv = MMKV.mmkvWithID("MyID", MMKV.MULTI_PROCESS_MODE);

4.CURD

// 添加/更新数据
kv.encode(key, value);

// 获取数据
int tmp = kv.decodeInt(key);

// 删除数据
kv.removeValueForKey(key);

5.数据迁移,建议迁移完成之后,通过mmkv.allkeys,方法获取所有的key和sp的总量数据做一个对比。看是否迁移完全

private void testImportSharedPreferences() {
    MMKV mmkv = MMKV.mmkvWithID("myData");
    SharedPreferences old_man = getSharedPreferences("myData", MODE_PRIVATE);
    // 迁移旧数据
    mmkv.importFromSharedPreferences(old_man);
    // 清空旧数据
    old_man.edit().clear().commit();
    ......
}

 

具体使用参照:腾讯官方文档

SP的使用略过

SP存在的问题


1.容易anr,无论是commit、apply、getxxx都可能导致anr。下面简单分析一下这几种情况

SharedPreferences 本身是一个接口,其具体的实现类是 SharedPreferencesImpl,而 Context 的各个和 SharedPreferences 相关的方法则是由 ContextImpl 来实现的。我们项目中的每个 SP 或多或少都是保存着一些键值对数据,而每当我们获取到一个 SharedPreferences 对象,其对应的键值对数据就会一直被保留在内存中,直到应用进程被终结(所以sp文件过大,对项目的内存占用有有很大影响),因为每个 SharedPreferences 对象都被系统作为静态变量缓存起来了,对应 ContextImpl 中的静态变量 sSharedPrefsCache

class ContextImpl extends Context {
    
    //根据应用包名缓存所有 SharedPreferences,根据 xmlFile 和具体的 SharedPreferencesImpl 对应上
    private static ArrayMap<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefsCache;

    //根据 fileName 拿到对应的 xmlFile
    private ArrayMap<String, File> mSharedPrefsPaths;

}

通常我们通过sp进行读写,第一步都是获取SharedPreferences对象。这块通过文件名加载想对象的文件进入内存,所以在app刚打开的时候,如果xml文件过大,这一块会很耗时,进而可能导致getxxx出现anr。

	@Override
    public SharedPreferences getSharedPreferences(String name, int mode) {
        ···
        File file;
        synchronized (ContextImpl.class) {
            if (mSharedPrefsPaths == null) {
                mSharedPrefsPaths = new ArrayMap<>();
            }
            file = mSharedPrefsPaths.get(name);
            if (file == null) {
                file = getSharedPreferencesPath(name);
                mSharedPrefsPaths.put(name, file);
            }
        }
        return getSharedPreferences(file, mode);
    }
    
    @Override
    public SharedPreferences getSharedPreferences(File file, int mode) {
        SharedPreferencesImpl sp;
        synchr
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Java OpenSAML实现SP(服务提供商),需要遵循以下步骤: 1.添加OpenSAML依赖项:在Maven项目中,可以通过添加以下依赖项来使用OpenSAML: ``` <dependency> <groupId>org.opensaml</groupId> <artifactId>opensaml-core</artifactId> <version>${opensaml.version}</version> </dependency> <dependency> <groupId>org.opensaml</groupId> <artifactId>opensaml-saml-api</artifactId> <version>${opensaml.version}</version> </dependency> <dependency> <groupId>org.opensaml</groupId> <artifactId>opensaml-saml-impl</artifactId> <version>${opensaml.version}</version> </dependency> ``` 2. 配置SP元数据:SP需要提供一个元数据文件,其中包含SP的基本信息,如实体ID、断言消费服务地址等。可以使用OpenSAML提供的API来创建和编写SP元数据文件。 3. 配置SAML处理器:在Java应用程序中,可以使用OpenSAML提供的API来创建和配置SAML处理器。处理器负责处理SAML消息,包括解析和验证SAML消息。 4. 实现SAML断言消费端:SP需要实现一个SAML断言消费端来接收和处理SAML断言。可以使用OpenSAML提供的API来实现SAML断言消费端。 5. 配置断言消费服务地址:SP需要指定一个断言消费服务地址,以接收来自IDP的SAML断言。可以在SP元数据文件中配置断言消费服务地址。 6. 启动SP:完成上述步骤后,可以启动SP来与IDP进行交互,并实现单点登录的功能。 以上是使用Java OpenSAML实现SP的基本步骤,具体实现过程可能会有所不同,需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值