原始网页直通车

简介

一个轻量级的存储类,以键值对的 XML 文件形式将数据存储在本地,程序卸载后也会一并清除,不会残留信息。

要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。 Android 中主要提供了 3 种方法用于得到 SharedPreferences 对象。

  1. Context 类中的 getSharedPreferences() 方法

    此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个, SharedPreferences 文件都是存放在 /data/data/<packagename>/shared_prefs/ 目录下的。第二个参数用于指定操作模式,目前只有 MODE_PRIVATE 这一种模式可选,它是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个 SharedPreferences 文件进行读写。

    其他几种操作模式均已被废弃, MODE_WORLD_READABLEMODE_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 :该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

  2. Activity 类中的 getPreferences() 方法

    这个方法和 Context 中的 getSharedPreferences() 方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文件名。

  3. 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();

优点

  1. 轻量级,以键值对的方式进行存储,使用方便,易于理解。
  2. 采用的是 XML 文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息。

缺点

  1. 由于是对文件 IO 读取,因此在 IO 上的瓶颈是个大问题。
  2. 多线程场景下效率比较低,因为 get 操作的时候,会锁定 SharedPreferencesImpl 里面的对象,互斥其他操作,而当 putcommit()apply() 操作的时候都会锁住 Editor 的对象,这样的情况下,效率会降低。
  3. 不支持跨进程通讯。
  4. 由于每次都会把整个文件加载到内存中,因此,如果 SharedPreferences 文件过大,或者在其中的键值对是大对象的 json 数据则会占用大量内存,读取较慢是一方面,同时也会引发程序频繁GC,导致的界面卡顿。

使用建议

  1. 不要存储较大数据或者较多数据到 SharedPreferences 中。
  2. 键值对不宜过多。
  3. 频繁修改的数据修改后统一提交,而不是修改过后马上提交。
  4. 在不需要返回值的情况下,使用 apply() 方法可以极大的提高性能。
  5. 在跨进程通讯中不去使用 SharedPreferences ,可以使用 mmkv

参考链接

  1. 每日一问:谈谈 SharedPreferences 的 apply() 和 commit()
  2. 第一行代码:Android(第 2 版)

对于 SharedPreferences 你觉得有什么优缺点?相关推荐

  1. Android SharedPreferences 详解 源码解析

    1.实现类 SharedPreferences 只是一个接口,其实现类是SharedPreferencesImpl. 工作流程分析: 创建sp 的时候,会去查看是否有bak文件,如果有的话,把bak文 ...

  2. 安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...

    Google 新增加了一个新 Jetpack 的成员 DataStore,主要用来替换 SharedPreferences, DataStore 应该是开发者期待已久的库,DataStore 是基于 ...

  3. Android SharedPreferences 的使用

    学而时习之,稳固而之心,如果这边文章帮助了您,希望给一个赞 如果你只是着急使用忘记了方法 那么下面这些代码完全满足了您的使用 private static final String USER = &q ...

  4. MySQL 学习笔记(5)— 视图优缺点、创建视图、修改视图、删除视图

    1. 视图概念 简单来说,视图就是一个预定义的查询语句.视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table). 视图与表最大的区别在于它不包含数据,数据库中只存储视图的定 ...

  5. nginx 代理 内存_科普Nginx和apache的区别及优缺点比较

    最近很多小伙伴来问我Nginx和apache的区别,这个问题用三言两语也很难解释,于是整理出了这一篇文章与大家共享.除了Nginx和apache的区别,还比较了各自的优缺点.这是我自学Nginx和工作 ...

  6. Android开发之SharedPreferences的封装

    对于大部分初学者来说,如果想利用SharedPreferences进行数据存储的话大部分人(包括本人)应该会这样: 存储: SharedPreferences sharedPreferences = ...

  7. singleton设计模式_让我们研究一下Singleton设计模式的优缺点

    singleton设计模式 by Navdeep Singh 通过Navdeep Singh 让我们研究一下Singleton设计模式的优缺点 (Let's examine the pros and ...

  8. javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点

    javascript优缺点 by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? 优缺点 (Why use static t ...

  9. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?...

    目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点: Microsoft TFS: 优点: 任务版上能将需求.项目进度一览无余,对 ...

最新文章

  1. 小H和游戏(无根树转有根树,思维)难度⭐⭐⭐★
  2. Cissp-【第2章 资产安全】-2021-1-14(163页-185页)
  3. context-param和init-param区别
  4. 【解析】Alice and Bob_24行代码AC
  5. GBT19056精要
  6. nacos enablediscoveryclient_Spring Cloud(五):注册中心nacos篇
  7. “万物互联·泛在智能” 2019 嵌入式智能国际大会烧脑开幕!
  8. php 腾讯短信接口api,腾讯云短信发送功能API-PHP接入
  9. 顶会两篇论文连发,华为云医疗AI低调中崭露头角
  10. [转][学习]软件绿色联盟应用体验标准5.0_功耗标准-公示版
  11. java 英文日期转数字_Java SimpleDateFormat中英文时间格式化转换详解
  12. 捷联惯导速度更新_划桨效应补偿算法推导(双子样)
  13. 让人心疼的12句话。。哪句说到你的痛了?
  14. php删除二维数组元素_php怎样删除二维数组中的元素
  15. c语言数组顺时针旋转90度,算法:数组顺时针、逆时针90度旋转
  16. 绩效考核为何不得人心?
  17. 学习日本人的“虚伪”
  18. 语义分割算法性能比较_语义分割江湖那些事儿
  19. 3.4.10nbsp;孙正义
  20. 关于同一ip有的电脑不能上网有的可以上网的解决方法

热门文章

  1. 西安石油大学研究生计算机专业,西安石油大学(专业学位)计算机技术考研难吗...
  2. 基于jsp学生考勤管理系统设计
  3. python学籍管理系统
  4. springboot+dubbo+zookeeper怎么设置熔断器并调用
  5. 图形处理 OpenGL硬件加速
  6. 为什么PHP项目运行报错502,php报错502badgateway解决方法
  7. Java中的装箱和拆箱—这一篇全了解
  8. 内网多个DHCP Server无法获取到地址上网的解决办法
  9. Webug-webshell爆破
  10. 图片转mnist格式数据