当前位置: 首页 > news >正文

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

背景:项目中一直使用的是原生 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.lryc.cn/news/302036.html

相关文章:

  • C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据
  • LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置
  • 微服务- 熔断、降级和限流
  • 电路设计(20)——数字电子钟的multism仿真
  • 【论文阅读笔记】Contrastive Learning with Stronger Augmentations
  • 前端win10如何设置固定ip(简单明了)
  • 数据结构1.0(基础)
  • anomalib1.0学习纪实-续2:三个文件夹
  • 【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树
  • Nginx https反向代理
  • zip解压缩
  • 电动五金工具行业调研:政策促进市场发展
  • 【矩阵】托普利茨矩阵
  • DS:八大排序之归并排序、计数排序
  • 由斐波那契数列探究递推与递归
  • 红队打靶练习:IMF: 1
  • 密码管理局以及什么是密评?为什么要做密评(商用密码应用安全性评估)?
  • 六、Datax通过json字符串运行
  • 关于数据库
  • 洛谷C++简单题小练习day14—闰年推算小程序
  • 房企关注的典型数字化场景之一:数字营销
  • BMS再进阶(新能源汽车电池管理系统)
  • K8s Deployment挂载ConfigMap权限设置
  • 百度智能云分布式数据库 GaiaDB-X 与龙芯平台完成兼容认证
  • 模拟电子技术——振荡器基本原理、RC桥式振荡器、矩形波发生电器
  • Vue3+Vite+TS+Pinia+ElementPlus+Router+Axios创建项目
  • VMware虚拟机安装CentOS7
  • Avalonia学习(二十四)-系统界面
  • 深入解析鸿蒙系统的页面路由(Router)机制
  • MCU中断响应流程及注意事项