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 数据库或其他存储解决方案。

相关推荐
Geeker555 小时前
如何在忘记密码的情况下解锁Android手机?
android·网络·macos·华为·智能手机·电脑·手机
wxx21506 小时前
【android】【adb shell】写一个shell脚本,监听进程pid变化
android·adb
心死翼未伤7 小时前
【MySQL基础篇】多表查询
android·数据结构·数据库·mysql·算法
喂_balabala7 小时前
Android手机拍照或从本地相册选取图片设置头像-高版本适配
android·开发语言
黑头!8 小时前
Tomcat注册为服务之后 运行时提示JVM异常
java·jvm·tomcat
蚊子码农8 小时前
JVM的基础介绍(1)
jvm
boy快快长大8 小时前
【JVM-04】线上CPU100%
jvm
_小马快跑_9 小时前
Android | StandardCharsets.UTF_8.toString() 遇到的兼容问题记录
android
wxx215010 小时前
【Android】【多屏】多屏异显异触调试技巧总结
android
人民的石头12 小时前
Android增量更新----java版
android