Android的轻量级存储SharedPreferences

希望文章能给到你启发和灵感~

感谢支持和关注~

阅读指南

序幕

近期写了个android项目,初期设计时,存储这块主要是以sqlite为主导,还使用了SharedPreferences用于存储登录和配置信息;这块我们的目的就是为了数据能在各个页面之间传递和共享;

SharedPreferences怎么存储

1、SharedPreferences以XML文件的形式存储数据,结构类似Java中Map的键值对的存储形式,这些文件通常保存在/data/data/PACKAGE_NAME/shared_prefs/目录下

SharedPreferences支持的数据类型

2、SharedPreferences支持存储Java常规的Long、Int、String等类型的数据

SharedPreferences操作模式

(1)Context.MODE_PRIVATE:这是默认的操作模式,表示该文件是私有数据,只能被应用本身访问。在该模式下,写入的内容会覆盖原文件的内容。

(2)Context.MODE_APPEND:此模式会检查文件是否存在,如果存在就往文件追加内容,否则就创建新文件

(3)Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE:这两个模式分别表示当前文件可以被其他应用读取和写入。但出于安全性的考虑,这两个模式在Android 4.2版本中已经被弃用。

使用范例

第一步:获取SharedPreferences

复制代码
SharedPreferences sharedPreferences = getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);

第二步:使用 SharedPreferences.Editor 存储数据

复制代码
SharedPreferences.Editor editor = sharedPreferences.edit();  
editor.putString("key", "value");  
editor.putInt("key_int", 123);  
editor.apply(); // 或者使用 editor.commit(); 但 apply() 是异步的,通常更快

第三步:查询数据

复制代码
String value = sharedPreferences.getString("key", "default_value");  
int valueInt = sharedPreferences.getInt("key_int", 0);

🌰:就好比我这里有记住用户的功能,使用sharedPreferences:

一、基础环境说明

考虑环境因素,大家适当的对比自己的软硬件环境情况分析~

1.1 硬件环境

MacOS Monterey 版本 12.6.8 Apple M1

1.2 软件环境

Android Studio 2021.2.1
Java 1.8.0_171

二、起因

有时候取值,界面出现卡顿现象,博主通常这里是频发,刚启动时就开始;

我们知道,android中页面的控制和跳转逻辑中,很重要的一个组件的就是Activity,开发的初期,其实博主并没有打算使用sqlite数据库,只是一股脑的想把数据存入SharedPreferences,毕竟不是特别大的项目,轻量级的存储就足够了,但是后来在app中各种事件处理过程中,频繁感觉页面时不时会有所卡顿出现;

三、解决

SharedPreferences使用的建议

3.1 尽量简化数据结构

SharedPreferences主要支持一些基础数据类型(如int, float, long, boolean)以及String的存储复杂数据并不太适合他,例如如果你存的是图像的类型,就必须对他进行数据编码转换字符串;这样就会增加了存储的复杂度和轻量级的初衷

3.2 文件尽量小

SharedPreferences创建初始化时,会将整个文件加载到内存中,所以这里如果你的文件很大,就会增加内存消耗,从而影响程序的其他操作的运行,导致程序崩溃或者卡顿问题;

3.3 减少保存的频率

尽量减少对SharedPreferences的编辑(edit)和提交(commit/apply)操作

每次edit都会创建一个新的EditorImpl对象,额外占据内存

commit/apply操作涉及IO操作,多次执行会影响性能

3.4 加载时机和性能考虑

避免在UI线程中执行大量的SharedPreferences操作,因为这可能导致界面卡顿;

提前初始化SharedPreferences,避免在首次创建时因读取文件而导致的等待情况

四、总结

SharedPreferences其实在某种形式上有点类似我们的redis,虽然没有那么强大,但是对于简单的配置信息保存是足够的,毕竟他的定位就是简单和轻量级;

保存SharedPreferences时apply() 和 commit() 方法的区别在于:apply() 是异步的,而 commit() 是同步的。因此,apply() 通常更快,但在某些情况下,你可能需要 commit() 的同步行为。

SharedPreferences 不适合存储大量数据或复杂的数据结构。对于这种情况,我们应该考虑使用 SQLite 数据库或其他存储解决方案。

相关推荐
平头哥AI17 小时前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
聚美智数18 小时前
图片广告检测-图片审核-图片广告识别-图像广告检测
android
mengzhi啊18 小时前
缓存类CacheDataManager把临时数据存入json。做成插件·
qt·缓存·json
0+11120 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm
早睡早起身体好12320 小时前
用 XGrammar 约束大模型工具调用:解决参数为空的问题
android·人工智能·神经网络·机器学习·自然语言处理·vllm
小lu飞21 小时前
DeepSeek Flash 降价的技术账本:缓存友好型定价如何改写推理成本结构
缓存
大佐不会说日语~1 天前
Android 16 下 uni-app APP 提示“网络连接失败”的排障与修复
android·uni-app
hweiyu001 天前
Redis命令:APPEND
redis·缓存
2501_915106321 天前
苹果App Store上架费用及流程全面解析
android·ios·小程序·https·uni-app·iphone·webview
敲代码的嘎仔1 天前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf