| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android ShardPreference简单的源码分析以及存在的问题(源码分析1) -> 正文阅读 |
|
[移动开发]Android ShardPreference简单的源码分析以及存在的问题(源码分析1) |
本文档属于学习时总结,如有大佬发现问题请一定评论纠错改正 Android ShardPreference源码分析ShardPreference源码分析1.序在Android的使用以及学习中,轻量化的持久存储是绝对必不可少的,同时ShardPreference也是很多人从刚开始用到现在的存储类,可以说是老少都用过的东西,那么这个东西真的就没有问题? 答案是否定的,因为谷歌甚至都想舍弃这个东西,从而在Jetpack全家桶里面发行了DataStore,当然我知道很多人都在使用MMKV,当然了,这里我也推荐使用MMKV或者DataStore,因为这两者是真的好用。 回到正题,要知道SP存在的问题,那么就要去阅读SP的源码,让我们从源码一步步分析 2.ShardPreference读取时的使用与源码分析
上面的代码就是我们日常使用的SP最常用的方式了,首先我们不使用任何封装,那么这就是最简单的获取SP示例的方式,然后我们点击 Context.getSharedPreferences() 进一步了解源码。
我们发现是mBase调用的,那么这个mBase是一个什么东西呢,是一个context对象,因为我们看到的源码其实是ContextWrapper这个包装类,所以我们应该继续点击get方法,结果跑到了一个抽象方法,然后不知所措?
经过简单的源码分析我们得出,SP在初始化的时候就是去加载文件到一个Map对象中,并且是异步的,理论上是没有什么问题的,那么接下来的操作如果使用不当,则会出问题。
如果我们要应用一个场景,那就是在Splash去判断,如果用户是第一次打开,则展示隐私条款,如果不是第一次打开则展示广告,那么代码可能是这样的
代码没问题,单独这么写也没问题,那么我们点击进去看一下源码,你会发现:
我们可以看到,有一个等待方法,如果Map初始化没有完成,那么将阻塞所有流程
那么,你可能会说,哎呦不就是一个几字节的文件哪,加载很快的啦? 3.ShardPreference写入时的使用与源码分析
用过的人都知道,edit()方法会直接new一个对象
代码如上,其实问题更大了,如果我写在一个Manager里面的话,直接搞一个静态变量不就得了,那么会直接导致上面的加载时间长,甚至ANR,当然你也可以区分xml之类的,这里就不多说了,如果随用随创建,那么使用不当可能会频繁gc,内存抖动,然后内存碎片导致OOM。 设置数据这一块没有什么可讲的,就是set进一个map等待下面的提交。
首先结论:无论是commit或者是apply,都有可能造成卡顿甚至ANR。 都知道Commit是同步代码提交,那么它会返回一个成功或者失败的Boolean变量,内部逻辑呢,就是取出map然后比较两个map的差异然后写入,这里就不多介绍,既然是同步那就一定会有一定的延迟,可能是忽略不计的,同步大家都懂,同时代码逻辑也简单一些。
通过代码我们清楚的看到,apply方法只是帮我们封装了一下,变成了一个runnable任务,然后交给QueuedWork去提交,代码如下
哇哦,相信大家一眼就定位到了问题所在,那就是 QueuedWork.waitToFinish();,那么我们经过一个小案例来演示一下 4.总结
5.一些其他的话本文章虽然是时间比较新,但是我发现SDK31以后ShardPreferenceImpl确实消失了,并且内容开始出现了DataStore,估计是谷歌要更换掉SP的底层架构,在原有API调用不变的方式下换个内脏,也有可能直接在getShardPreference()方法打上废弃标签,大家拭目以待。 接下来会发一下MMKV的源码分析以及SDK31以后的SP底层到底发生了什么变化,喜欢可以关注一下哦,大家一起进步~! |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 20:05:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |