希望文章能给到你启发和灵感~
感谢支持和关注~
阅读指南
- 序幕
- SharedPreferences怎么存储
- SharedPreferences支持的数据类型
- SharedPreferences操作模式
- 使用范例
- 一、基础环境说明
- 1.1 硬件环境
- 1.2 软件环境
- 二、起因
- 三、解决
- 3.1 尽量简化数据结构
- 3.2 文件尽量小
- 3.3 减少保存的频率
- 3.4 加载时机和性能考虑
- 四、总结
序幕
近期写了个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 数据库或其他存储解决方案。