Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

news2024/11/28 12:34:05

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题:


java.io.FileDescriptor.sync (FileDescriptor.java)
android.os.FileUtils.sync (FileUtils.java:256)
android.app.SharedPreferencesImpl.writeToFile (SharedPreferencesImpl.java:807)
android.app.SharedPreferencesImpl.access$900 (SharedPreferencesImpl.java:59)
android.app.SharedPreferencesImpl$2.run (SharedPreferencesImpl.java:672)
android.app.QueuedWork.processPendingWork (QueuedWork.java:265)
android.app.QueuedWork.waitToFinish (QueuedWork.java:178)
android.app.ActivityThread.handleServiceArgs (ActivityThread.java:4977)
android.app.ActivityThread.access$2300 (ActivityThread.java:284)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2322)
android.os.Handler.dispatchMessage (Handler.java:106)
android.os.Looper.loopOnce (Looper.java:233)
android.os.Looper.loop (Looper.java:334)
android.app.ActivityThread.main (ActivityThread.java:8396)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:582)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1068)

因此,替换原生 SP 迫在眉睫。

本文记录如何使用腾讯开源框架 MMKV 替换原生 SP、以及替换后当中遇到的一些问题解决。

一、替换方案选择

综合考虑,我们选择了方案3

二、接入 MMKV

  1. 新建 MMKV module

build.gradle 中添加依赖,这里采用的是较为稳定的版本 1.2.14

implementation 'com.tencent:mmkv:1.2.14'

2. 重新实现SharedPreferences.Editor, SharedPreferences 以及迁移原本的 SharePreferences 数据


package com.mikel.mmkv;

import android.content.Context;
import android.content.SharedPreferences;

import com.tencent.mmkv.MMKV;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class MMKVSP implements SharedPreferences.Editor, SharedPreferences {

    private MMKV mmkv;
    private Context mContext;
    private boolean isMultiprocess;
    private ArrayList<OnSharedPreferenceChangeListener> listeners;
    private final Object listenerLock = new Object();
    public static void initialize(Context context) {
         MMKV.initialize(context);
    }

    public MMKVSP(Context context, String name, boolean multiProcess) {
        mContext = context;
        isMultiprocess = multiProcess;
        mmkv = MMKV.mmkvWithID(name,
                (isMultiprocess? Context.MODE_MULTI_PROCESS :  Context.MODE_PRIVATE));
        listeners = new ArrayList<>();
        importFromAndroidSp(name);
    }

    private void importFromAndroidSp(String fileName) {
        MMKV migrateSpRecord = MMKV.mmkvWithID("migrate_sp_record");
        boolean isImported = migrateSpRecord.getBoolean(fileName, false);
        SharedPreferences sharedPreferences = null;
        if (!isImported) {
            if(mContext instanceof IMMKVProvider) {
                sharedPreferences = ((IMMKVProvider)mContext).getSuperSharedPreferences(fileN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot3】Spring Security 核心概念

一、什么是 Spring Security 注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff0c;充分利用了…

Vue | (一)Vue核心(下) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;class与style绑定&#x1f4da;条件渲染&#x1f4da;列表渲染&#x1f407;基本列表&#x1f407;key的原理&#x1f407;列表过滤&#xff08;搜索&#xff09;&#x1f407;列表排序&#x1f407;Vue数据监测 &#x1f4da;收集表单数据&#x1f4da;…

2024/2/18:IO进程线程

作业1&#xff1a;使用fgets统计给定文件的行数 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {//定义FILE *类型的句柄FILE *fpNULL;//判断是否进行了外部传参if(argc ! 2){pri…

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…

html的无语义标签:div span

html的无语义标签&#xff1a;div & span 无语义标签&#xff1a;div & span 标题&#xff0c;段落&#xff0c;图片等都是通过固定的标签来表示&#xff0c;标题用h1~h6标签来表示&#xff0c;段落用p标签来表示&#xff0c;图片用img标签来表示……每个标签都有自己…

电商数据分析数据统计数据监控必备-电商API电商数据接口

API&#xff0c;全称Application Programming Interface&#xff0c;是一种用于不同应用程序间通信的接口&#xff0c;它允许不同的应用程序之间交换数据和功能。API可以理解为应用程序提供给其他应用程序或开发者的接口&#xff0c;通过这个接口&#xff0c;其他应用程序或开发…

质量当先:国辰智企QMS产品质量追溯平台助力电子企业发展

在当今竞争激烈的电子产品市场中&#xff0c;质量是企业成功的关键。为了满足客户对高品质产品的需求&#xff0c;企业需要一套可靠的质量管理系统。QMS产品质量追溯平台为电子产品行业提供了全面的解决方案&#xff0c;确保产品质量的可追溯性和持续改进。 产品质量追溯平台是…

【软件设计师】程序猿需掌握的技能——数据流图

作为一个程序员&#xff0c;不仅要具备高水平的程序编码能力&#xff0c;还要是熟练掌握软件设计的方法和技术&#xff0c;具有一定的软件设计能力&#xff0c;一般包括软件分析设计图&#xff08;常见的有数据流图&#xff0c;程序流程图&#xff0c;系统流程图&#xff0c;E-…

Python与SQLAlchemy:轻松管理数据库

在这篇文章中&#xff0c;我们将学习如何使用Python和SQLAlchemy库来轻松管理数据库。SQLAlchemy是一个强大的ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许您通过Python代码与关系型数据库进行交互&#xff0c;而无需编写SQL语句。 一、安装SQLAlchemy 首先…

Android studio 中英文转换

一、确认版本号 需要确认android studio软件版本&#xff0c;根据版本下载对应的中文汉化包&#xff0c;如果安装的汉化包版本不对应&#xff0c;可能会导致安装失败。 面板选择Help→About&#xff0c;在弹出框中查看当前版本号&#xff0c;我们只需要关心版本号前面的222即可…

智慧图书管理系统架构设计与实现

随着数字化时代的到来&#xff0c;智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求&#xff0c;还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现&#xff0c;以满足…

在 Python 中,通过列表字典创建 DataFrame 时,若字典的 key 的顺序不一样以及部分字典缺失某些键,pandas 将如何处理?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ pandas 是一个快速、强大、灵活且易于使用的开源数据分析和处理工具&#xff0c;它是建立在 Python 编程语言之上的。 pandas 官方文档地址&#xff1a;https://pandas.pydata.org/ 在 Python 中&…

第九篇:node静态文件服务(中间件)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! &#x1f4d8; 引言&#xff1a; 当今互联网时代&am…

IDEA实现序列化时如何自动生成serialVersionUID

实现步骤&#xff1a;1.安装GenerateSerialVersionUID插件 2.点击idea左上角File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues &#xff0c;找到 Serializable class without ‘serialVersionUID’ ->打上勾&#xff0c;再点击Apply-&…

《剑指 Offer》专项突破版 - 面试题 49、50 和 51 : 详解与二叉树中路径相关的面试题(C++ 实现)

目录 面试题 49 : 从根节点到叶节点的路径数字之和 面试题 50 : 向下的路径节点值之和 面试题 51 : 节点值之和最大的路径 面试题 49 : 从根节点到叶节点的路径数字之和 题目&#xff1a; 在一棵二叉树中所有节点都在 0~9 的范围之内&#xff0c;从根节点到叶节点的路径表…

5G车载路由器引领无人驾驶车联网应用

随着无人驾驶技术的不断发展&#xff0c;车联网正逐渐成为实现智能交通的重要组成部分。5G车载路由器将在车联网的应用中起到至关重要的作用&#xff0c;它能够满足无人驾驶应用的低时延、高速率和实时控制等需求&#xff0c;进一步推动无人驾驶车联网技术。 5G路由器具备低时延…

ACK One:构建混合云同城容灾系统

作者&#xff1a;蔡靖 对于当前业务运行在 IDC 内的 Kubernetes 集群中&#xff0c;希望通过云计算为云下业务提供同城灾备的高可用冗余能力&#xff0c;可利用阿里云分布式云容器平台 ACK One [ 1] 来提供统一得流量、应用和集群管理&#xff0c;实现业务流量的多集群路由和灾…

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

解决Ubuntu下网络适配器桥接模式下ping网址不通的情况

问题反应&#xff1a;ping不通网址 打开虚拟机中的设置&#xff0c;更改网络适配器为NAT模式 确定保存更改之后&#xff0c;退出输入如下命令。 命令1&#xff1a; sudo /etc/network/inferfaces 命令2&#xff1a; sudo /etc/init.d/network/ restart

Poller模块与Channel模块整合

目录 概要 tcp_cli.cc tcp_srv.cc server.hpp 测试结果 gdb调试 概要 本主要是将以下模块进行整合测试 Buffer缓冲区类实现(模块一)-CSDN博客 Socket套接字类实现(模块二)-CSDN博客 Channel事件管理类实现(模块三)-CSDN博客 Poller描述符监控类实现(模块四)-CSDN博客 经…