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

SharedPreferences

Android轻量级数据存储

import android.content.Context;
import android.content.SharedPreferences;public class SharedPreferencesUtil {private SharedPreferences sharedPreferences;private SharedPreferences.Editor editor;public SharedPreferencesUtil(Context context, String fileName) {this.sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);this.editor = sharedPreferences.edit();}public void putString(String key, String value) {editor.putString(key, value);editor.apply(); //异步提交}public String getString(String key, String defaultValue) {return sharedPreferences.getString(key, defaultValue);}public void putInt(String key, int value) {editor.putInt(key, value);editor.apply();}public int getInt(String key, int defaultValue) {return sharedPreferences.getInt(key, defaultValue);}public void putBoolean(String key, boolean value) {editor.putBoolean(key, value);editor.apply();}public boolean getBoolean(String key, boolean defaultValue) {return sharedPreferences.getBoolean(key, defaultValue);}public void remove(String key) {editor.remove(key);editor.apply();}public void clear() {editor.clear();editor.apply();}
}

一个键值对保存的xml文件,存储在data/data/package/shared_prefs文件夹下

获取Sp的源码:

public SharedPreferences getSharedPreferences(String name, int mode) {if (mPackageInfo.getApplicationInfo().targetSdkVersion <Build.VERSION_CODES.KITKAT) {if (name == null) {name = "null";}}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;synchronized (ContextImpl.class) {final ArrayMap<File, SharedPreferencesImpl> cache =getSharedPreferencesCacheLocked();sp = cache.get(file);if (sp == null) {checkMode(mode);sp = new SharedPreferencesImpl(file, mode);cache.put(file, sp);return sp;}}if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {sp.startReloadIfChangedUnexpectedly();}return sp;
}

SharedPreferences是个接口,其实现类是SharedPreferencesImpl,其构造方法如下:

SharedPreferencesImpl(File file, int mode) {mFile = file;mBackupFile = makeBackupFile(file);mMode = mode;mLoaded = false;mMap = null;mThrowable = null;startLoadFromDisk();
}

在startLoadFromDisk()中会从磁盘中加载xml文件,并将内容映射到mMap中
每次获取Sp对象时,都会把所有的存储数据从磁盘读取到内存,所以如果存储内容过多,会导致OOM

public String getString(String key, @Nullable String defValue) {synchronized (mLock) {awaitLoadedLocked();String v = (String)mMap.get(key);return v != null ? v : defValue;}}

从上面的代码可以看出,在调用getString()的时候加锁了,如果在主线程调用,意味着主线程被锁,如果此时Sp对象还未被获取,那么只有等Sp对象获取之后才能释放锁,这里可能会造成阻塞

public boolean commit() {long startTime = 0;MemoryCommitResult mcr = commitToMemory();SharedPreferencesImpl.this.enqueueDiskWrite(mcr, null /* 在当前线程同步写入 */);try {mcr.writtenToDiskLatch.await();} catch (InterruptedException e) {return false;} notifyListeners(mcr);return mcr.writeToDiskResult;
}

从上面代码可以看出commit()调用时,将内存中的Sp写入到磁盘,是个耗时操作,所以不要频繁的调用commit(),频繁的调用可能会导致ANR

public void apply() {final long startTime = System.currentTimeMillis();final MemoryCommitResult mcr = commitToMemory();final Runnable awaitCommit = new Runnable() {@Overridepublic void run() {try {mcr.writtenToDiskLatch.await();} catch (InterruptedException ignored) {}}};QueuedWork.addFinisher(awaitCommit);Runnable postWriteRunnable = new Runnable() {@Overridepublic void run() {awaitCommit.run();QueuedWork.removeFinisher(awaitCommit);}};SharedPreferencesImpl.this.enqueueDiskWrite(mcr, postWriteRunnable);notifyListeners(mcr);}

从上面的源码可以看出每次apply都会创建一个任务添加到 QueueWork中,如果频繁的执行写入操作,会造成ANR,
Android8.0之后优化,如果连续多次写入,只执行最后一次

Sp通过锁来保证线程安全,没有进程安全

文件备份机制
Sp在写入内容打磁盘时,会把原来的内容备份,写入成功后,会删掉备份内容
如果写入时发生异常,那么在下次启动时,如果有备份文件,会把备份文件作为源文件,未成功的文件删掉

相关文章:

SharedPreferences

Android轻量级数据存储 import android.content.Context; import android.content.SharedPreferences;public class SharedPreferencesUtil {private SharedPreferences sharedPreferences;private SharedPreferences.Editor editor;public SharedPreferencesUtil(Context con…...

服务(第二十五篇)redis的优化和持久化

持久化的功能&#xff1a;Redis是内存数据库&#xff0c;数据都是存储在内存中&#xff0c;为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失&#xff0c;需要定期将Redis中的数据以某种形式&#xff08;数据或命令&#xff09;从内存保存到硬盘&#xff1b;当下…...

David Silver Lecture 7: Policy Gradient

1 Introduction 1.1 Policy-Based Reinforcement Learning 1.2 Value-based and policy based RL 基于值的强化学习 在基于值的 RL 中&#xff0c;目标是找到一个最优的值函数&#xff0c;通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值&#xff0c;表…...

知识图谱学习笔记——(五)知识图谱推理

一、知识学习 声明&#xff1a;知识学习中本文主体按照浙江大学陈华钧教授的《知识图谱》公开课讲义进行介绍&#xff0c;并个别地方加入了自己的注释和思考&#xff0c;希望大家尊重陈华钧教授的知识产权&#xff0c;在使用时加上出处。感谢陈华钧教授。 &#xff08;一&…...

用vs2010编译和调试多个arx版本的arx项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一级标题二级标题三级标题四级标题五级标题六级标题升级原先vs2008版本的项目文件到2010,或直接用vs2010新建一个arx项目; vs中查看项目属性:Project menu -> Properties,项目名上右…...

安全相关词汇

• DEW: Data Encryption Workshop • HSM: Hardware Security Module • KMS: Key Management System • KAM: Key Account Management • DHSM: Dedicated Hardware Security Module • KPS: Key Pair Service • CSMS: Cloud Secret Management Service • PCI-DSS: …...

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…...

2023年认证杯二阶段C题数据合并python以及matlab多途径实现代码

对于每种心率下给出的数据&#xff0c;我们需要进行合并才能方便后续处理&#xff0c;这里为大家展示利用python以及matlab分别实现合并的代码 import pandas as pd import os# 创建一个空的DataFrame对象 merged_data pd.DataFrame()# 设置数据文件所在的文件夹路径 folder_…...

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…...

S32K144低功耗休眠与唤醒实践总结

在做车载项目时&#xff0c;模块在常供电时需要维系随时可以被唤醒工作的状态&#xff0c;并且静态电流需要在3mA以内&#xff0c;当然在JTT1163标准中要求的是5mA以内。 目标明确了&#xff0c;在模块休眠时需要关闭一切不必要的资源消耗&#xff0c;只保留模块被唤醒的部分功…...

一文吃透 Vue 框架教程(上)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

堆排序与取topK java实现

1.堆排序思路 最近趁着有点时间&#xff0c;稍微复习了一下数据结构相关内容&#xff0c;温习了一下堆排序&#xff0c;做一下记录。 首先我们复习一下什么是堆&#xff1a; 堆是具有以下性质的完全二叉树&#xff1a;每个结点的值都大于或等于其左右孩子结点的值&#xff0c…...

https通信流程通俗理解

场景&#xff0c;假设A和B进行通信 CA: ( Certificate Authority &#xff09;就是颁发 HTTPS 证书的组织。 通信流程步骤&#xff1a; 1、A告诉B使用 RSA算法进行加密&#xff0c;B说好的。 2、A和B同时用 RSA算法各自生成一对公钥密钥&#xff0c;各自的公钥密钥都不同。 3…...

银行零售业务转型方法论:打造数字化的“有机体”

传统的业务增长进度叫做连续性创新&#xff0c;它是在一条曲线上渐进性的改良和发展&#xff0c;但这种发展终有极限&#xff0c;如果不能及时开辟第二增长曲线&#xff0c;就很容易被时代所抛弃。过去十年&#xff0c;以互联网为代表的数字化转型的先行者&#xff0c;不断冲击…...

【STM32】STM32使用RFID读卡器

STM32使用RFID读卡器 RFID卡片 ID卡&#xff08;身份标识&#xff09;&#xff1a;作用就是比如你要输入学号&#xff0c;你刷卡直接就相当于输入学号&#xff0c;省去了输入的过程 IC卡&#xff1a;集成电路卡&#xff0c;是将一种微电子芯片嵌入卡片之中 RFID的操作 1、…...

spring集成mybatis的原理

spring是怎样和mybatis继承的&#xff1f; 在idea里点mapper.queryOne()直接跳到了接口或xml&#xff0c;它究竟是怎样利用jdbc执行的&#xff1f; 我直接调用mapper.queryOne是怎么使用的sqlsession&#xff1f;怎么去connect的&#xff1f; mybatis是怎样根据mapper找到对应的…...

限速神器RateLimiter源码解析 | 京东云技术团队

作者&#xff1a;京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流&#xff1a; •场景一、高并发的用户端场景。 尤其是C端系统&#xff0c;经常面对海量用户请求&#xff0c;如不做限流&#xff0c;遇到瞬间高并发的场景&#xff0c;则可能压垮系统…...

spring中怎样优化第三方bean?

需求:将数据库连接四要素提取到properties配置文件&#xff0c;spring来加载配置信息并使用这些信息来完成属性注入。第三方bean属性优化的思路如下&#xff1a; 1.在resources下创建一个jdbc.properties(文件的名称可以任意) 2.将数据库连接四要素配置到配置文件中 3.在Spr…...

8分钟的面试,我直呼太变态了......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…...

别去外包,干了3年,彻底废了......

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…...

Pixel Couplet Gen 模型部署进阶:Ubuntu服务器生产环境配置

Pixel Couplet Gen 模型部署进阶&#xff1a;Ubuntu服务器生产环境配置 1. 前言&#xff1a;为什么需要生产级部署&#xff1f; 你可能已经体验过Pixel Couplet Gen的一键部署版本&#xff0c;那种简单快捷的方式确实很适合本地测试和开发。但当我们需要把这个模型真正投入生…...

GLM-4.1V-9B-Base视觉能力深度评测:从图标识别到复杂图表理解

GLM-4.1V-9B-Base视觉能力深度评测&#xff1a;从图标识别到复杂图表理解 1. 开篇&#xff1a;当AI开始"看懂"图表 想象一下&#xff0c;你随手拍了一张公司季度报表的截图发给AI&#xff0c;它不仅能准确识别出里面的柱状图、折线图&#xff0c;还能告诉你哪个产品…...

千问3.5-2B与卷积神经网络(CNN)的融合应用:多模态理解初探

千问3.5-2B与卷积神经网络&#xff08;CNN&#xff09;的融合应用&#xff1a;多模态理解初探 1. 跨模态AI的新突破 当语言模型遇上计算机视觉&#xff0c;会擦出怎样的火花&#xff1f;最近我们尝试将千问3.5-2B语言模型与经典的卷积神经网络&#xff08;CNN&#xff09;进行…...

低轨星座融合:撬动万亿低空经济的天地密钥

低轨星座融合&#xff1a;撬动万亿低空经济的天地密钥 引言 当无人机飞越无信号的深山&#xff0c;当空中出租车需要厘米级导航时&#xff0c;地面网络已力不从心。低轨星座与低空经济的融合&#xff0c;正构建一张“空天地海”一体化的智能网络&#xff0c;成为解锁万亿级市…...

前端八股JS---数组方法

目录 超简速查表&#xff08;一图记全部&#xff09;一、遍历 / 循环类1. forEach2. map3. filter4. reduce二、查找 / 判断类5. find6. findIndex7. includes8. some9. every三、增删改&#xff08;会改变原数组&#xff09;10. push11. pop12. unshift13. shift14. splice四…...

CentOS 7.9 SNAT/DNAT 详解与 VMware 17 实验全流程【20260412】003篇

文章目录 一、核心原则:为什么不能直接用 VMware 的「NAT 模式」做 DNAT/SNAT? 二、VMware 环境规划(拓扑图 + IP 分配表) ▶️ 推荐拓扑(最简、最可控、最贴近生产) ▶️ VMware 网络适配器配置(Gateway 虚拟机) ▶️ 虚拟机清单与 IP 分配 三、CentOS 7.9 虚拟机详细…...

告别编译烦恼:Python非官方预编译轮子(.whl)高效检索与下载指南

1. 为什么我们需要非官方预编译轮子&#xff1f; 很多Python开发者都遇到过这样的场景&#xff1a;在Windows上安装某个科学计算库时&#xff0c;pip install命令运行后突然报出一堆红色错误&#xff0c;提示缺少Visual C编译工具或者某些系统依赖。这时候你会发现&#xff0c;…...

量化入门-用Python筛选爆量上涨的股票酒

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容&#xff1a; 渲染代码&#xff1a; # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

Java性能调优实战:如何用IBM Thread and Monitor Dump Analyzer快速定位死锁问题

Java性能调优实战&#xff1a;如何用IBM Thread and Monitor Dump Analyzer快速定位死锁问题 在分布式系统和高并发场景下&#xff0c;Java应用的线程死锁问题如同潜伏的暗礁&#xff0c;随时可能让整个系统陷入瘫痪。作为开发者&#xff0c;我们需要的不仅是一把螺丝刀&#x…...

CodeMagicianT源

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知&#xff0c;本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台&#xff0c;有非常多的配置参数。详细的参数列表可以…...