对于 SharedPreferences 你觉得有什么优缺点?
原始网页直通车
简介
一个轻量级的存储类,以键值对的 XML
文件形式将数据存储在本地,程序卸载后也会一并清除,不会残留信息。
要想使用 SharedPreferences
来存储数据,首先需要获取到 SharedPreferences
对象。 Android
中主要提供了 3 种方法用于得到 SharedPreferences
对象。
Context
类中的getSharedPreferences()
方法此方法接收两个参数,第一个参数用于指定
SharedPreferences
文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences
文件都是存放在/data/data/<packagename>/shared_prefs/
目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE
这一种模式可选,它是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences
文件进行读写。其他几种操作模式均已被废弃,
MODE_WORLD_READABLE
和MODE_WORLD_WRITEABLE
这两种模式是在Android 4.2
版本中被废弃的,MODE_MULTI_PROCESS
模式是在Android 6.0
版本中被废弃的。Context.MODE_PRIVATE
: 指定该SharedPreferences
数据只能被本应用程序读、写;
Context.MODE_WORLD_READABLE
: 指定该SharedPreferences
数据能被其他应用程序读,但不能写;
Context.MODE_WORLD_WRITEABLE
: 指定该SharedPreferences
数据能被其他应用程序读;
Context.MODE_APPEND
:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;Activity
类中的getPreferences()
方法这个方法和
Context
中的getSharedPreferences()
方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences
的文件名。PreferenceManager
类中的getDefaultSharedPreferences()
方法这是一个静态方法,它接收一个
Context
参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences
文件。
使用
SharedPreferences
对象本身只能获取数据而不支持存储和修改,存储修改是通过 SharedPreferences.edit()
获取的内部类 Editor
对象实现。
// 写入数据
SharedPreferences sharedPreferences = getSharedPreferences("data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.apply();// 读取数据
SharedPreferences sharedPreferences = getSharedPreferences("data", Context.MODE_PRIVATE);
String userId = sharedPreferences.getString("name", "");// 删除指定数据
editor.remove("name");
editor.commit();// 清空数据
editor.clear();
editor.commit();
优点
- 轻量级,以键值对的方式进行存储,使用方便,易于理解。
- 采用的是
XML
文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息。
缺点
- 由于是对文件
IO
读取,因此在IO
上的瓶颈是个大问题。 - 多线程场景下效率比较低,因为
get
操作的时候,会锁定SharedPreferencesImpl
里面的对象,互斥其他操作,而当put
、commit()
和apply()
操作的时候都会锁住Editor
的对象,这样的情况下,效率会降低。 - 不支持跨进程通讯。
- 由于每次都会把整个文件加载到内存中,因此,如果
SharedPreferences
文件过大,或者在其中的键值对是大对象的json
数据则会占用大量内存,读取较慢是一方面,同时也会引发程序频繁GC,导致的界面卡顿。
使用建议
- 不要存储较大数据或者较多数据到
SharedPreferences
中。 - 键值对不宜过多。
- 频繁修改的数据修改后统一提交,而不是修改过后马上提交。
- 在不需要返回值的情况下,使用
apply()
方法可以极大的提高性能。 - 在跨进程通讯中不去使用
SharedPreferences
,可以使用mmkv
。
参考链接
- 每日一问:谈谈 SharedPreferences 的 apply() 和 commit()
- 第一行代码:Android(第 2 版)
对于 SharedPreferences 你觉得有什么优缺点?相关推荐
- Android SharedPreferences 详解 源码解析
1.实现类 SharedPreferences 只是一个接口,其实现类是SharedPreferencesImpl. 工作流程分析: 创建sp 的时候,会去查看是否有bak文件,如果有的话,把bak文 ...
- 安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...
Google 新增加了一个新 Jetpack 的成员 DataStore,主要用来替换 SharedPreferences, DataStore 应该是开发者期待已久的库,DataStore 是基于 ...
- Android SharedPreferences 的使用
学而时习之,稳固而之心,如果这边文章帮助了您,希望给一个赞 如果你只是着急使用忘记了方法 那么下面这些代码完全满足了您的使用 private static final String USER = &q ...
- MySQL 学习笔记(5)— 视图优缺点、创建视图、修改视图、删除视图
1. 视图概念 简单来说,视图就是一个预定义的查询语句.视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table). 视图与表最大的区别在于它不包含数据,数据库中只存储视图的定 ...
- nginx 代理 内存_科普Nginx和apache的区别及优缺点比较
最近很多小伙伴来问我Nginx和apache的区别,这个问题用三言两语也很难解释,于是整理出了这一篇文章与大家共享.除了Nginx和apache的区别,还比较了各自的优缺点.这是我自学Nginx和工作 ...
- Android开发之SharedPreferences的封装
对于大部分初学者来说,如果想利用SharedPreferences进行数据存储的话大部分人(包括本人)应该会这样: 存储: SharedPreferences sharedPreferences = ...
- singleton设计模式_让我们研究一下Singleton设计模式的优缺点
singleton设计模式 by Navdeep Singh 通过Navdeep Singh 让我们研究一下Singleton设计模式的优缺点 (Let's examine the pros and ...
- javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点
javascript优缺点 by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? 优缺点 (Why use static t ...
- 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?...
目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点: Microsoft TFS: 优点: 任务版上能将需求.项目进度一览无余,对 ...
最新文章
- 小H和游戏(无根树转有根树,思维)难度⭐⭐⭐★
- Cissp-【第2章 资产安全】-2021-1-14(163页-185页)
- context-param和init-param区别
- 【解析】Alice and Bob_24行代码AC
- GBT19056精要
- nacos enablediscoveryclient_Spring Cloud(五):注册中心nacos篇
- “万物互联·泛在智能” 2019 嵌入式智能国际大会烧脑开幕!
- php 腾讯短信接口api,腾讯云短信发送功能API-PHP接入
- 顶会两篇论文连发,华为云医疗AI低调中崭露头角
- [转][学习]软件绿色联盟应用体验标准5.0_功耗标准-公示版
- java 英文日期转数字_Java SimpleDateFormat中英文时间格式化转换详解
- 捷联惯导速度更新_划桨效应补偿算法推导(双子样)
- 让人心疼的12句话。。哪句说到你的痛了?
- php删除二维数组元素_php怎样删除二维数组中的元素
- c语言数组顺时针旋转90度,算法:数组顺时针、逆时针90度旋转
- 绩效考核为何不得人心?
- 学习日本人的“虚伪”
- 语义分割算法性能比较_语义分割江湖那些事儿
- 3.4.10nbsp;孙正义
- 关于同一ip有的电脑不能上网有的可以上网的解决方法