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

相关推荐
库库林_沙琪马1 小时前
Redis 持久化:从零到掌握
数据库·redis·缓存
太空漫步112 小时前
android社畜模拟器
android
海绵宝宝_5 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
小梁不秃捏5 小时前
JVM 类加载器深度解析(含实战案例)
jvm·类加载器
凯文的内存6 小时前
android 定制mtp连接外设的设备名称
android·media·mtp·mtpserver
天若子6 小时前
Android今日头条的屏幕适配方案
android
林的快手8 小时前
伪类选择器
android·前端·css·chrome·ajax·html·json
望佑8 小时前
Tmp detached view should be removed from RecyclerView before it can be recycled
android
-$_$-9 小时前
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
数据库·redis·缓存
Tirzano9 小时前
springboot 定义多个缓存管理器
spring boot·后端·缓存